From 9498380c6f7484e940b135c6078dd1929c0b8ad4 Mon Sep 17 00:00:00 2001 From: liejiu946 Date: Fri, 20 Mar 2026 15:31:04 +0800 Subject: [PATCH] =?UTF-8?q?opt:1.=E6=9B=B4=E6=96=B0=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A6=96=E9=A1=B5=E7=9C=8B=E6=9D=BF=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/api/task/api/TaskAPI.java | 10 +++ .../nl/map/controller/MapInfoController.java | 2 +- .../java/org/nl/map/service/MapService.java | 11 +++ .../nl/map/service/impl/MapServiceImpl.java | 6 ++ .../controller/DashboardController.java | 27 +++++++ .../dashboard/dto/DashboardDataDto.java | 41 ++++++++++ .../dashboard/param/DashboardQueryParam.java | 16 ++++ .../dashboard/service/DashboardService.java | 17 ++++ .../service/impl/DashboardServiceImpl.java | 80 +++++++++++++++++++ .../org/nl/task/provider/TaskAPIProvider.java | 32 ++++++++ .../java/org/nl/task/service/TaskService.java | 8 ++ .../nl/task/service/impl/TaskServiceImpl.java | 8 ++ 12 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 nl-business-monitor/src/main/java/org/nl/monitor/dashboard/controller/DashboardController.java create mode 100644 nl-business-monitor/src/main/java/org/nl/monitor/dashboard/dto/DashboardDataDto.java create mode 100644 nl-business-monitor/src/main/java/org/nl/monitor/dashboard/param/DashboardQueryParam.java create mode 100644 nl-business-monitor/src/main/java/org/nl/monitor/dashboard/service/DashboardService.java create mode 100644 nl-business-monitor/src/main/java/org/nl/monitor/dashboard/service/impl/DashboardServiceImpl.java 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 2886ccb..b649cc5 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 @@ -4,6 +4,8 @@ import org.nl.api.task.core.OneClickOperationRequestParam; import org.nl.api.task.core.TaskRequestParam; import org.nl.response.WebResponse; +import java.util.Map; + /** * @author dsh * 2025/12/11 @@ -93,4 +95,12 @@ public interface TaskAPI { * @return */ WebResponse oneClickOperation(OneClickOperationRequestParam param,String source); + + /** + * 按时间范围查询任务数据(用于看板统计) + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 任务列表 + */ + Map queryTasksByTimeRange(String startTime, String endTime); } diff --git a/nl-business-map/src/main/java/org/nl/map/controller/MapInfoController.java b/nl-business-map/src/main/java/org/nl/map/controller/MapInfoController.java index 4d483fe..bb10e9e 100644 --- a/nl-business-map/src/main/java/org/nl/map/controller/MapInfoController.java +++ b/nl-business-map/src/main/java/org/nl/map/controller/MapInfoController.java @@ -27,6 +27,6 @@ public class MapInfoController { @PostMapping("/syncCurrentMapData") @Log("同步当前地图最新数据") public ResponseEntity syncCurrentMapData() { - return new ResponseEntity<>(null,HttpStatus.OK); + return new ResponseEntity<>(mapService.syncCurrentMapData(),HttpStatus.OK); } } diff --git a/nl-business-map/src/main/java/org/nl/map/service/MapService.java b/nl-business-map/src/main/java/org/nl/map/service/MapService.java index b3ff5b7..a2524f7 100644 --- a/nl-business-map/src/main/java/org/nl/map/service/MapService.java +++ b/nl-business-map/src/main/java/org/nl/map/service/MapService.java @@ -7,5 +7,16 @@ import org.nl.response.WebResponse; * 2025/12/18 */ public interface MapService { + /** + * 获取当前地图信息 + * @return + */ WebResponse queryCurrentMapInfo(); + + /** + * 同步当前地图数据 + * @return + */ + WebResponse syncCurrentMapData(); + } diff --git a/nl-business-map/src/main/java/org/nl/map/service/impl/MapServiceImpl.java b/nl-business-map/src/main/java/org/nl/map/service/impl/MapServiceImpl.java index 4fef3d6..c1a5dff 100644 --- a/nl-business-map/src/main/java/org/nl/map/service/impl/MapServiceImpl.java +++ b/nl-business-map/src/main/java/org/nl/map/service/impl/MapServiceImpl.java @@ -149,4 +149,10 @@ public class MapServiceImpl implements MapService { ); return WebResponse.requestParamOk(mapInfo); } + + @Override + public WebResponse syncCurrentMapData() { + init(); + return WebResponse.requestOk(); + } } diff --git a/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/controller/DashboardController.java b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/controller/DashboardController.java new file mode 100644 index 0000000..7ca9257 --- /dev/null +++ b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/controller/DashboardController.java @@ -0,0 +1,27 @@ +package org.nl.monitor.dashboard.controller; + +import jakarta.annotation.Resource; +import org.nl.monitor.dashboard.service.DashboardService; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author dsh + * 2026/3/20 + */ +@RestController +@RequestMapping("/dashboard") +public class DashboardController { + + @Resource + private DashboardService dashboardService; + + @GetMapping("/queryDashboardData") + public ResponseEntity queryDashboardData(@RequestParam String timeRange) { + return new ResponseEntity<>(dashboardService.queryDashboardData(timeRange), HttpStatus.OK); + } +} diff --git a/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/dto/DashboardDataDto.java b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/dto/DashboardDataDto.java new file mode 100644 index 0000000..59ee79d --- /dev/null +++ b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/dto/DashboardDataDto.java @@ -0,0 +1,41 @@ +package org.nl.monitor.dashboard.dto; + +import lombok.Data; + +/** + * @author dsh + * 2026/3/20 + */ +@Data +public class DashboardDataDto { + + /** + * 总任务数 + */ + private Long totalTasks; + + /** + * 执行中的任务数 + */ + private Long executingTasks; + + /** + * 已完成的任务数 + */ + private Long completedTasks; + + /** + * 已取消的任务数 + */ + private Long canceledTasks; + + /** + * 完成率 (%) + */ + private Double completionRate; + + /** + * 取消率 (%) + */ + private Double cancellationRate; +} diff --git a/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/param/DashboardQueryParam.java b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/param/DashboardQueryParam.java new file mode 100644 index 0000000..bbd32bb --- /dev/null +++ b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/param/DashboardQueryParam.java @@ -0,0 +1,16 @@ +package org.nl.monitor.dashboard.param; + +import lombok.Data; + +/** + * @author dsh + * 2026/3/20 + */ +@Data +public class DashboardQueryParam { + + /** + * 时间范围类型: today(今天), week(一周), month(一个月) + */ + private String timeRange; +} diff --git a/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/service/DashboardService.java b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/service/DashboardService.java new file mode 100644 index 0000000..c9b616a --- /dev/null +++ b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/service/DashboardService.java @@ -0,0 +1,17 @@ +package org.nl.monitor.dashboard.service; + +import org.nl.response.WebResponse; + +/** + * @author dsh + * 2026/3/20 + */ +public interface DashboardService { + + /** + * 查询看板数据 + * @param timeRange 时间范围: today(今天), week(一周), month(一个月) + * @return 看板数据 + */ + WebResponse queryDashboardData(String timeRange); +} diff --git a/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/service/impl/DashboardServiceImpl.java b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/service/impl/DashboardServiceImpl.java new file mode 100644 index 0000000..51abdff --- /dev/null +++ b/nl-business-monitor/src/main/java/org/nl/monitor/dashboard/service/impl/DashboardServiceImpl.java @@ -0,0 +1,80 @@ +package org.nl.monitor.dashboard.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.nl.api.task.api.TaskAPI; +import org.nl.config.language.LangProcess; +import org.nl.exception.BadRequestException; +import org.nl.monitor.dashboard.dto.DashboardDataDto; +import org.nl.monitor.dashboard.service.DashboardService; +import org.nl.response.WebResponse; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.Map; + +/** + * @author dsh + * 2026/3/20 + */ +@Slf4j +@Service +public class DashboardServiceImpl implements DashboardService { + + @Resource + private TaskAPI taskAPI; + + @Override + public WebResponse queryDashboardData(String timeRange) { + if (StrUtil.isBlank(timeRange)) { + throw new BadRequestException(LangProcess.msg("param_is_null")); + } + + // 获取时间范围 + String[] timeRange_arr = getTimeRange(timeRange); + String startTime = timeRange_arr[0]; + String endTime = timeRange_arr[1]; + + // 从数据库查询指定时间范围内的任务统计数据 + Map statisticsData = taskAPI.queryTasksByTimeRange(startTime, endTime); + + // 构建返回数据 + DashboardDataDto dto = new DashboardDataDto(); + dto.setTotalTasks(((Number) statisticsData.get("totalTasks")).longValue()); + dto.setExecutingTasks(((Number) statisticsData.get("executingTasks")).longValue()); + dto.setCompletedTasks(((Number) statisticsData.get("completedTasks")).longValue()); + dto.setCanceledTasks(((Number) statisticsData.get("canceledTasks")).longValue()); + dto.setCompletionRate(((Number) statisticsData.get("completionRate")).doubleValue()); + dto.setCancellationRate(((Number) statisticsData.get("cancellationRate")).doubleValue()); + + return WebResponse.requestParamOk(dto); + } + + /** + * 根据时间范围获取开始和结束时间 + * @return [startTime, endTime] + */ + private String[] getTimeRange(String timeRange) { + Date now = new Date(); + Date startDate; + Date endDate = now; + + switch (timeRange) { + case "today": + startDate = DateUtil.beginOfDay(now); + break; + case "week": + startDate = DateUtil.offsetDay(DateUtil.beginOfDay(now), -7); + break; + case "month": + startDate = DateUtil.offsetDay(DateUtil.beginOfDay(now), -30); + break; + default: + throw new BadRequestException("Invalid timeRange: " + timeRange); + } + + return new String[]{DateUtil.formatDateTime(startDate), DateUtil.formatDateTime(endDate)}; + } +} 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 8d65568..28f6587 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 @@ -167,4 +167,36 @@ public class TaskAPIProvider implements TaskAPI { public WebResponse oneClickOperation(OneClickOperationRequestParam param, String source) { return taskService.oneClickOperation(param, source); } + + @Override + public Map queryTasksByTimeRange(String startTime, String endTime) { + List taskList = taskService.queryTasksByTimeRange(startTime, endTime); + + // 统计数据 + long totalTasks = taskList.size(); + long executingTasks = taskList.stream() + .filter(task -> TaskStatusEnum.EXECUTING.getCode().equals(task.getStatus())) + .count(); + long completedTasks = taskList.stream() + .filter(task -> TaskStatusEnum.FINISHED.getCode().equals(task.getStatus())) + .count(); + long canceledTasks = taskList.stream() + .filter(task -> TaskStatusEnum.CANCELED.getCode().equals(task.getStatus())) + .count(); + + // 计算完成率和取消率 + double completionRate = totalTasks > 0 ? (completedTasks * 100.0 / totalTasks) : 0; + double cancellationRate = totalTasks > 0 ? (canceledTasks * 100.0 / totalTasks) : 0; + + // 构建统计数据 Map + Map statisticsData = new java.util.HashMap<>(); + statisticsData.put("totalTasks", totalTasks); + statisticsData.put("executingTasks", executingTasks); + statisticsData.put("completedTasks", completedTasks); + statisticsData.put("canceledTasks", canceledTasks); + statisticsData.put("completionRate", Math.round(completionRate * 100.0) / 100.0); + statisticsData.put("cancellationRate", Math.round(cancellationRate * 100.0) / 100.0); + + return statisticsData; + } } 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 f5efcc0..272967b 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 @@ -81,4 +81,12 @@ public interface TaskService extends IService{ */ WebResponse createCruiseTask(CreateCruiseTaskRequestParam param); + /** + * 按时间范围查询任务数据(用于看板统计) + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 任务列表 + */ + List queryTasksByTimeRange(String startTime, String endTime); + } 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 a43642f..fa48a10 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 @@ -359,4 +359,12 @@ public class TaskServiceImpl extends ServiceImpl implements Tas } } + @Override + public List queryTasksByTimeRange(String startTime, String endTime) { + return taskMapper.selectList(new LambdaQueryWrapper<>(Task.class) + .ge(StrUtil.isNotBlank(startTime), Task::getCreate_time, startTime) + .le(StrUtil.isNotBlank(endTime), Task::getCreate_time, endTime) + ); + } + }