From b693340185451c186c97c49bef9e6924ec1ea9ba Mon Sep 17 00:00:00 2001 From: liejiu946 Date: Wed, 18 Mar 2026 19:00:26 +0800 Subject: [PATCH] =?UTF-8?q?opt:1.=E5=A2=9E=E5=8A=A0=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=8F=B0=E5=8A=9F=E8=83=BD=E3=80=822.=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=88=B7=E6=96=B0=E6=97=B6=E9=97=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/nl/api/map/api/MapAPI.java | 9 ++++ .../java/org/nl/api/task/api/TaskAPI.java | 14 +++++ .../core}/OneClickOperationRequestParam.java | 2 +- .../org/nl/map/provider/MapAPIProvider.java | 14 +++++ .../controller/OptionManagerController.java | 30 +++++++++++ .../service/OptionManagerService.java | 16 ++++++ .../impl/OptionManagerServiceImpl.java | 54 +++++++++++++++++++ .../service/impl/VehicleServiceImpl.java | 4 +- .../controller/ManagerTaskController.java | 7 +++ .../service/impl/QRCodeServiceImpl.java | 1 - .../nl/task/controller/TaskController.java | 1 + .../org/nl/task/provider/TaskAPIProvider.java | 32 +++++++++++ .../java/org/nl/task/service/TaskService.java | 3 +- .../nl/task/service/impl/TaskServiceImpl.java | 9 ++-- .../src/main/resources/config/application.yml | 1 + .../resources/language/buss/buss.properties | 2 +- 16 files changed, 187 insertions(+), 12 deletions(-) rename {nl-business-task/src/main/java/org/nl/task/param => nl-business-api/src/main/java/org/nl/api/task/core}/OneClickOperationRequestParam.java (93%) create mode 100644 nl-business-monitor/src/main/java/org/nl/monitor/optionManager/controller/OptionManagerController.java create mode 100644 nl-business-monitor/src/main/java/org/nl/monitor/optionManager/service/OptionManagerService.java create mode 100644 nl-business-monitor/src/main/java/org/nl/monitor/optionManager/service/impl/OptionManagerServiceImpl.java diff --git a/nl-business-api/src/main/java/org/nl/api/map/api/MapAPI.java b/nl-business-api/src/main/java/org/nl/api/map/api/MapAPI.java index 151913a..11570c9 100644 --- a/nl-business-api/src/main/java/org/nl/api/map/api/MapAPI.java +++ b/nl-business-api/src/main/java/org/nl/api/map/api/MapAPI.java @@ -2,6 +2,9 @@ package org.nl.api.map.api; import org.nl.response.WebResponse; +import java.util.List; +import java.util.Map; + /** * @author dsh * 2026/3/9 @@ -13,4 +16,10 @@ public interface MapAPI { * @return */ WebResponse getAllStations(); + + /** + * 获取所有站点列表(原始数据,便于在其他模块中组合使用) + * @return List of station map + */ + List> getAllStationList(); } diff --git a/nl-business-api/src/main/java/org/nl/api/task/api/TaskAPI.java b/nl-business-api/src/main/java/org/nl/api/task/api/TaskAPI.java index 3f2379b..2886ccb 100644 --- a/nl-business-api/src/main/java/org/nl/api/task/api/TaskAPI.java +++ b/nl-business-api/src/main/java/org/nl/api/task/api/TaskAPI.java @@ -1,5 +1,6 @@ package org.nl.api.task.api; +import org.nl.api.task.core.OneClickOperationRequestParam; import org.nl.api.task.core.TaskRequestParam; import org.nl.response.WebResponse; @@ -79,4 +80,17 @@ public interface TaskAPI { * @return */ WebResponse queryNotFinishTaskInfos(); + + /** + * 查询所有房间的任务状态 + * key: room_code, value: 任务状态信息(无任务时为null) + * @return Map + */ + WebResponse queryAllRoomStatus(); + + /** + * 一键任务 + * @return + */ + WebResponse oneClickOperation(OneClickOperationRequestParam param,String source); } diff --git a/nl-business-task/src/main/java/org/nl/task/param/OneClickOperationRequestParam.java b/nl-business-api/src/main/java/org/nl/api/task/core/OneClickOperationRequestParam.java similarity index 93% rename from nl-business-task/src/main/java/org/nl/task/param/OneClickOperationRequestParam.java rename to nl-business-api/src/main/java/org/nl/api/task/core/OneClickOperationRequestParam.java index af84753..a1e4035 100644 --- a/nl-business-task/src/main/java/org/nl/task/param/OneClickOperationRequestParam.java +++ b/nl-business-api/src/main/java/org/nl/api/task/core/OneClickOperationRequestParam.java @@ -1,4 +1,4 @@ -package org.nl.task.param; +package org.nl.api.task.core; import jakarta.validation.constraints.NotBlank; import lombok.Data; diff --git a/nl-business-map/src/main/java/org/nl/map/provider/MapAPIProvider.java b/nl-business-map/src/main/java/org/nl/map/provider/MapAPIProvider.java index 75a885a..168eeb9 100644 --- a/nl-business-map/src/main/java/org/nl/map/provider/MapAPIProvider.java +++ b/nl-business-map/src/main/java/org/nl/map/provider/MapAPIProvider.java @@ -1,12 +1,18 @@ package org.nl.map.provider; +import cn.hutool.core.bean.BeanUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.nl.api.map.api.MapAPI; +import org.nl.map.station.entity.Station; import org.nl.map.station.service.MapStationService; import org.nl.response.WebResponse; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * @author dsh * 2026/3/9 @@ -22,4 +28,12 @@ public class MapAPIProvider implements MapAPI { public WebResponse getAllStations() { return mapStationService.queryAllStation(); } + + @Override + public List> getAllStationList() { + List stations = mapStationService.list(); + return stations.stream() + .map(station -> BeanUtil.beanToMap(station, false, true)) + .collect(Collectors.toList()); + } } diff --git a/nl-business-monitor/src/main/java/org/nl/monitor/optionManager/controller/OptionManagerController.java b/nl-business-monitor/src/main/java/org/nl/monitor/optionManager/controller/OptionManagerController.java new file mode 100644 index 0000000..e2ec4cd --- /dev/null +++ b/nl-business-monitor/src/main/java/org/nl/monitor/optionManager/controller/OptionManagerController.java @@ -0,0 +1,30 @@ +package org.nl.monitor.optionManager.controller; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.nl.logging.annotation.Log; +import org.nl.monitor.optionManager.service.OptionManagerService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author dsh + * 2026/3/18 + */ +@RestController +@RequestMapping("/optionManager") +@Slf4j +public class OptionManagerController { + + @Resource + private OptionManagerService optionManagerService; + + @GetMapping("/queryAllStationWithTaskStatus") + @Log("查询所有站点任务状态") + public ResponseEntity queryAllStationWithTaskStatus() { + return new ResponseEntity<>(optionManagerService.queryAllStationWithTaskStatus(), HttpStatus.OK); + } +} diff --git a/nl-business-monitor/src/main/java/org/nl/monitor/optionManager/service/OptionManagerService.java b/nl-business-monitor/src/main/java/org/nl/monitor/optionManager/service/OptionManagerService.java new file mode 100644 index 0000000..adb10f2 --- /dev/null +++ b/nl-business-monitor/src/main/java/org/nl/monitor/optionManager/service/OptionManagerService.java @@ -0,0 +1,16 @@ +package org.nl.monitor.optionManager.service; + +import org.nl.response.WebResponse; + +/** + * @author dsh + * 2026/3/18 + */ +public interface OptionManagerService { + + /** + * 查询所有站点及其任务状态(前端房间列表展示用) + * @return List,每项包含站点信息 + 当前任务状态 + */ + WebResponse queryAllStationWithTaskStatus(); +} diff --git a/nl-business-monitor/src/main/java/org/nl/monitor/optionManager/service/impl/OptionManagerServiceImpl.java b/nl-business-monitor/src/main/java/org/nl/monitor/optionManager/service/impl/OptionManagerServiceImpl.java new file mode 100644 index 0000000..f72f50f --- /dev/null +++ b/nl-business-monitor/src/main/java/org/nl/monitor/optionManager/service/impl/OptionManagerServiceImpl.java @@ -0,0 +1,54 @@ +package org.nl.monitor.optionManager.service.impl; + +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.nl.api.map.api.MapAPI; +import org.nl.api.task.api.TaskAPI; +import org.nl.monitor.optionManager.service.OptionManagerService; +import org.nl.response.WebResponse; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author dsh + * 2026/3/18 + */ +@Slf4j +@Service +public class OptionManagerServiceImpl implements OptionManagerService { + + @Resource + private MapAPI mapAPI; + + @Resource + private TaskAPI taskAPI; + + @Override + public WebResponse queryAllStationWithTaskStatus() { + // 获取所有站点 + List> stationList = mapAPI.getAllStationList(); + // 获取所有有任务的房间状态 Map: stationCode -> taskInfo + WebResponse roomStatusResponse = taskAPI.queryAllRoomStatus(); + Map roomStatusMap = new HashMap<>(); + if (roomStatusResponse != null && roomStatusResponse.getData() instanceof Map) { + roomStatusMap = (Map) roomStatusResponse.getData(); + } + // 合并:每个站点附加任务状态 + List> result = new ArrayList<>(); + for (Map station : stationList) { + Map item = new HashMap<>(station); + String stationCode = String.valueOf(station.get("station_code")); + Object taskInfo = roomStatusMap.get(stationCode); + // hasTask: 该站点是否有未完成任务 + item.put("hasTask", taskInfo != null); + // taskInfo: 任务详情,无任务时为 null + item.put("taskInfo", taskInfo); + result.add(item); + } + return WebResponse.requestParamOk(result); + } +} diff --git a/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/service/impl/VehicleServiceImpl.java b/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/service/impl/VehicleServiceImpl.java index 80826c6..cbd55c1 100644 --- a/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/service/impl/VehicleServiceImpl.java +++ b/nl-business-schedule/src/main/java/org/nl/schedule/modular/vehicle/service/impl/VehicleServiceImpl.java @@ -50,7 +50,7 @@ public class VehicleServiceImpl implements VehicleService { /** * 定时更新车辆信息(每秒执行) */ - @Scheduled(fixedRate = 1000) // 每秒执行一次 + @Scheduled(fixedRate = 500) // 每秒执行一次 public void updateVehicleInfo() { try { List vehicles = getAllVehicles(); @@ -76,7 +76,7 @@ public class VehicleServiceImpl implements VehicleService { } } - @Scheduled(fixedRate = 1000) + @Scheduled(fixedRate = 300) public void pushVehicleInfo(){ CopyOnWriteArraySet webSocketSet = WebSocketVehicleInfoServer.getWebSocketSet(); diff --git a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/task/controller/ManagerTaskController.java b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/task/controller/ManagerTaskController.java index 69cac9f..6628a8c 100644 --- a/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/task/controller/ManagerTaskController.java +++ b/nl-business-sys/src/main/java/org/nl/sys/modular/backgroundmanagement/task/controller/ManagerTaskController.java @@ -2,6 +2,7 @@ package org.nl.sys.modular.backgroundmanagement.task.controller; import jakarta.annotation.Resource; import org.nl.api.task.api.TaskAPI; +import org.nl.api.task.core.OneClickOperationRequestParam; import org.nl.api.task.core.TaskRequestParam; import org.nl.enums.TaskSourceEnum; import org.nl.logging.annotation.Log; @@ -31,4 +32,10 @@ public class ManagerTaskController { public ResponseEntity cancelTask(@RequestParam String taskCode){ return new ResponseEntity<>(taskAPI.cancelTask(taskCode), HttpStatus.OK); } + + @Log("后台管理系统一键任务") + @PostMapping("/oneClickOperation") + public ResponseEntity oneClickOperation(@RequestBody OneClickOperationRequestParam oneClickOperationRequestParam){ + return new ResponseEntity<>(taskAPI.oneClickOperation(oneClickOperationRequestParam,TaskSourceEnum.BACKGROUNDMANAGEMENT.getName()), HttpStatus.OK); + } } diff --git a/nl-business-sys/src/main/java/org/nl/sys/modular/qrcode/service/impl/QRCodeServiceImpl.java b/nl-business-sys/src/main/java/org/nl/sys/modular/qrcode/service/impl/QRCodeServiceImpl.java index 441dd63..edf71f1 100644 --- a/nl-business-sys/src/main/java/org/nl/sys/modular/qrcode/service/impl/QRCodeServiceImpl.java +++ b/nl-business-sys/src/main/java/org/nl/sys/modular/qrcode/service/impl/QRCodeServiceImpl.java @@ -15,7 +15,6 @@ import org.nl.config.language.LangProcess; import org.nl.enums.TaskSourceEnum; import org.nl.exception.BadRequestException; import org.nl.response.WebResponse; -import org.nl.sys.modular.anomalyInfo.dao.ErrorInfo; import org.nl.sys.modular.qrcode.dao.QRcodeInfo; import org.nl.sys.modular.qrcode.mapper.QRcodeInfoMapper; import org.nl.sys.modular.qrcode.param.GenerateQRCodeParam; diff --git a/nl-business-task/src/main/java/org/nl/task/controller/TaskController.java b/nl-business-task/src/main/java/org/nl/task/controller/TaskController.java index 26f2d9f..48c549b 100644 --- a/nl-business-task/src/main/java/org/nl/task/controller/TaskController.java +++ b/nl-business-task/src/main/java/org/nl/task/controller/TaskController.java @@ -2,6 +2,7 @@ package org.nl.task.controller; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.nl.api.task.core.OneClickOperationRequestParam; import org.nl.logging.annotation.Log; import org.nl.enums.TaskSourceEnum; import org.nl.task.param.*; diff --git a/nl-business-task/src/main/java/org/nl/task/provider/TaskAPIProvider.java b/nl-business-task/src/main/java/org/nl/task/provider/TaskAPIProvider.java index 5ef8514..623220e 100644 --- a/nl-business-task/src/main/java/org/nl/task/provider/TaskAPIProvider.java +++ b/nl-business-task/src/main/java/org/nl/task/provider/TaskAPIProvider.java @@ -10,6 +10,7 @@ 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.OneClickOperationRequestParam; import org.nl.api.task.core.TaskRequestParam; import org.nl.response.WebResponse; import org.nl.task.entity.Task; @@ -21,6 +22,8 @@ import org.nl.task.service.TaskService; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @author dsh @@ -119,4 +122,33 @@ public class TaskAPIProvider implements TaskAPI { public WebResponse queryNotFinishTaskInfos() { return WebResponse.requestParamOk(taskService.queryCurrentTaskInfo()); } + + @Override + public WebResponse queryAllRoomStatus() { + List taskList = taskService.queryCurrentTaskInfo(); + // 以 destinations(房间号) 为 key,任务信息为 value,构建房间状态 Map + // 同一个房间有多个任务时,优先取执行中(EXECUTING)的任务,否则取第一个 + Map roomStatusMap = taskList.stream() + .filter(task -> StrUtil.isNotBlank(task.getDestinations())) + .collect(Collectors.toMap( + Task::getDestinations, + task -> task, + (existing, replacement) -> { + // 已有执行中的任务则保留,否则用新的替换 + if (TaskStatusEnum.EXECUTING.getCode().equals(existing.getStatus())) { + return existing; + } + if (TaskStatusEnum.EXECUTING.getCode().equals(replacement.getStatus())) { + return replacement; + } + return existing; + } + )); + return WebResponse.requestParamOk(roomStatusMap); + } + + @Override + public WebResponse oneClickOperation(OneClickOperationRequestParam param, String source) { + return taskService.oneClickOperation(param, source); + } } diff --git a/nl-business-task/src/main/java/org/nl/task/service/TaskService.java b/nl-business-task/src/main/java/org/nl/task/service/TaskService.java index b240acd..f5efcc0 100644 --- a/nl-business-task/src/main/java/org/nl/task/service/TaskService.java +++ b/nl-business-task/src/main/java/org/nl/task/service/TaskService.java @@ -1,6 +1,7 @@ package org.nl.task.service; import com.baomidou.mybatisplus.extension.service.IService; +import org.nl.api.task.core.OneClickOperationRequestParam; import org.nl.response.WebResponse; import org.nl.task.entity.Task; import org.nl.task.param.*; @@ -66,7 +67,7 @@ public interface TaskService extends IService{ * @param oneClickOperationRequestParam * @return WebResponse */ - WebResponse oneClickOperation(OneClickOperationRequestParam oneClickOperationRequestParam,String taskSource); + WebResponse oneClickOperation(OneClickOperationRequestParam oneClickOperationRequestParam, String taskSource); /** * 查询当前任务信息 diff --git a/nl-business-task/src/main/java/org/nl/task/service/impl/TaskServiceImpl.java b/nl-business-task/src/main/java/org/nl/task/service/impl/TaskServiceImpl.java index 8e5fd0d..a43642f 100644 --- a/nl-business-task/src/main/java/org/nl/task/service/impl/TaskServiceImpl.java +++ b/nl-business-task/src/main/java/org/nl/task/service/impl/TaskServiceImpl.java @@ -5,8 +5,6 @@ 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; @@ -19,6 +17,7 @@ import org.nl.api.schedule.task.api.ScheduleTaskAPI; import org.nl.api.schedule.task.core.ScheduleAPICreateCruiseTaskParam; import org.nl.api.schedule.task.core.ScheduleAPICreateOneClickTaskParam; import org.nl.api.schedule.task.core.ScheduleAPICreateTaskParam; +import org.nl.api.task.core.OneClickOperationRequestParam; import org.nl.config.language.LangProcess; import org.nl.enums.ScheduleTaskReportStatusEnum; import org.nl.enums.TaskSourceEnum; @@ -39,9 +38,7 @@ 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.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; @@ -73,7 +70,7 @@ public class TaskServiceImpl extends ServiceImpl implements Tas /** * 定时查询车辆任务状态(每秒执行) */ - @Scheduled(fixedRate = 1000) // 每秒执行一次 + @Scheduled(fixedRate = 500) // 每秒执行一次 public void queryScheduleTaskStatus() { try { List taskList = taskMapper.selectList(new LambdaQueryWrapper<>(Task.class) @@ -294,7 +291,7 @@ public class TaskServiceImpl extends ServiceImpl implements Tas @Override @Transactional(rollbackFor = Exception.class) - public WebResponse oneClickOperation(OneClickOperationRequestParam oneClickOperationRequestParam,String taskSource) { + public WebResponse oneClickOperation(OneClickOperationRequestParam oneClickOperationRequestParam, String taskSource) { try { log.info("一键任务操作参数:{}",oneClickOperationRequestParam); Task task = BeanUtil.copyProperties(oneClickOperationRequestParam, Task.class); diff --git a/nl-web-app/src/main/resources/config/application.yml b/nl-web-app/src/main/resources/config/application.yml index d3c87e1..1236ad1 100644 --- a/nl-web-app/src/main/resources/config/application.yml +++ b/nl-web-app/src/main/resources/config/application.yml @@ -51,6 +51,7 @@ security: - /mapinfo/** - /security/** - /mapMonitor/** + - /mapStation/** - /api/scheduleTask/** - /setting/** - /vehicle/** diff --git a/nl-web-app/src/main/resources/language/buss/buss.properties b/nl-web-app/src/main/resources/language/buss/buss.properties index 155f790..1892ba5 100644 --- a/nl-web-app/src/main/resources/language/buss/buss.properties +++ b/nl-web-app/src/main/resources/language/buss/buss.properties @@ -48,7 +48,7 @@ task_resume_failed = 恢复任务失败:{0} task_station_code_empty = 站号不能为空 task_report_not_arrived = 未上报到达点位,无法确认到达 task_confirm_arrival_failed = 任务到达确认失败 -task_next_station_failed = 任务下一站失败:{0} +task_next_station_failed = 任务下发失败:{0} create_cruise_task_error = 任务类型不是巡航类型 # 异常信息相关