This commit is contained in:
2026-06-03 16:53:02 +08:00
parent f02329b2d0
commit 133a2bd223
31 changed files with 929 additions and 296 deletions

View File

@@ -4,12 +4,21 @@ import com.maibu.core.business.DevicePlan;
import com.maibu.core.controller.BaseController;
import com.maibu.core.domain.AjaxResult;
import com.maibu.core.domain.model.LoginUser;
import com.maibu.core.enums.DeviceTaskStaus;
import com.maibu.core.page.TableDataInfo;
import com.maibu.dto.DeviceTaskCommandDTO;
import com.maibu.dto.DeviceTaskQueryDTO;
import com.maibu.memory.GlobalMemory;
import com.maibu.memory.SiteMemory;
import com.maibu.service.DeviceTaskService;
import com.maibu.utils.SecurityUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
@RestController
@RequestMapping("/iot/deviceTask")
public class DeviceTaskController extends BaseController {
@@ -28,6 +37,15 @@ public class DeviceTaskController extends BaseController {
return AjaxResult.success(deviceTaskService.getDeviceTaskByUser(userId));
}
@GetMapping("/getSiteDevicePlan")
public AjaxResult getSiteDevicePlan(@RequestParam Long siteId,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startTime,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endTime,
@RequestParam(required = false) String deviceId,
@RequestParam(required = false) DeviceTaskStaus taskStaus) {
return AjaxResult.success(deviceTaskService.getSiteDevicePlan(siteId, startTime, endTime, deviceId, taskStaus));
}
@PostMapping("/getDevicePlan")
public AjaxResult getDevicePlan(@RequestBody DeviceTaskQueryDTO dto) {
return AjaxResult.success(deviceTaskService.getDeviceTask(dto));
@@ -68,8 +86,63 @@ public class DeviceTaskController extends BaseController {
}
@PostMapping("/deviceTaskPool")
public AjaxResult deviceTaskPool(@RequestBody DeviceTaskQueryDTO dto) {
return AjaxResult.success(deviceTaskService.deviceTaskPool(dto));
public TableDataInfo deviceTaskPool(@RequestBody DeviceTaskQueryDTO dto) {
startPage();
return getDataTable(deviceTaskService.deviceTaskPool(dto));
}
@PostMapping("/getSiteDeviceTaskHistory")
public TableDataInfo getSiteDeviceTaskHistory(@RequestBody DeviceTaskQueryDTO dto) {
startPage();
return getDataTable(deviceTaskService.getSiteDeviceTaskHistory(dto));
}
@PostMapping("/createDeviceTask")
public AjaxResult createDeviceTask(@RequestBody DeviceTaskCommandDTO dto) {
String deviceId = dto.getDeviceId();
Long siteId = dto.getSiteId();
Long orgId = dto.getOrgId();
if (StringUtils.isEmpty(deviceId)) {
return AjaxResult.error("deviceId为空!");
}
if (siteId == null) {
return AjaxResult.error("siteId为空!");
}
if (orgId == null) {
return AjaxResult.error("orgId为空!");
}
SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId);
if (siteMemory.hasTask(deviceId)) {
return AjaxResult.error("当前设备存在任务!");
}
return AjaxResult.success(deviceTaskService.createDeviceTask(dto, getLoginUser().getUsername()));
}
@PostMapping("/cancelTask")
public AjaxResult cancelTask(@RequestBody DeviceTaskCommandDTO dto) {
String deviceId = dto.getDeviceId();
if (StringUtils.isEmpty(deviceId) && dto.getTaskId() == null) {
return AjaxResult.error("deviceId或taskId为空!");
}
return AjaxResult.success(deviceTaskService.cancelTask(dto, getUsername()));
}
@PostMapping("/pauseTask")
public AjaxResult pauseTask(@RequestBody DeviceTaskCommandDTO dto) {
String deviceId = dto.getDeviceId();
if (StringUtils.isEmpty(deviceId) && dto.getTaskId() == null) {
return AjaxResult.error("deviceId或taskId为空!");
}
return AjaxResult.success(deviceTaskService.pauseTask(dto, getUsername()));
}
@PostMapping("/recoveryTask")
public AjaxResult recoveryTask(@RequestBody DeviceTaskCommandDTO dto) {
String deviceId = dto.getDeviceId();
if (StringUtils.isEmpty(deviceId) && dto.getTaskId() == null) {
return AjaxResult.error("deviceId或taskId为空!");
}
return AjaxResult.success(deviceTaskService.recoveryTask(dto, getUsername()));
}

View File

@@ -0,0 +1,23 @@
package com.maibu.dto;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class DeviceTaskCommandDTO {
private String deviceId;
private Long routeId; // 线路id
private LocalDateTime startTime; //开始时间 时分秒
private Long orgId;
private Long siteId;
private Long taskId;
}

View File

@@ -9,11 +9,13 @@ import java.time.LocalDateTime;
public class DeviceTaskQueryDTO {
private Long userId;
private LocalDateTime startTime;
private LocalDateTime endTime;
// private LocalDateTime startTime;
// private LocalDateTime endTime;
private DeviceTaskStaus taskStaus;
private String planName;
private Long planId;
private String deviceId;
private Long siteId;
private Long orgId;
}

View File

@@ -2,9 +2,14 @@ package com.maibu.init;
import com.maibu.constant.FastBeeConstant;
import com.maibu.core.business.DevicePlan;
import com.maibu.core.business.DevicePlanTask;
import com.maibu.core.domain.entity.SysSite;
import com.maibu.core.enums.DeviceTaskStaus;
import com.maibu.mapper.DevicePlanMapper;
import com.maibu.mapper.DevicePlanTaskMapper;
import com.maibu.mapper.SysSiteMapper;
import com.maibu.mapper.SysUserClientMapper;
import com.maibu.memory.GlobalMemory;
import com.maibu.memory.SiteMemory;
import com.maibu.mybatis.LambdaQueryWrapperX;
import com.maibu.service.DevicePlanTaskMonitorService;
@@ -46,7 +51,10 @@ public class InitThread implements ApplicationRunner {
private DevicePlanMapper devicePlanMapper;
@Autowired
private SysUserClientMapper sysUserClientMapper;
private DevicePlanTaskMapper devicePlanTaskMapper;
@Autowired
private SysSiteMapper sysSiteMapper;
@Override
public void run(ApplicationArguments args) {
@@ -82,17 +90,60 @@ public class InitThread implements ApplicationRunner {
/**
* 恢复内存
*/
public void recoverMemory(){
public void recoverMemory() {
//todo 启动时清除当前登录记录
// System.out.println("开始清除登录信息");
// sysUserClientMapper.clearDeviceName();
List<SysSite> siteList = sysSiteMapper.selectList();
if (!CollectionUtils.isEmpty(siteList)) {
siteList.forEach(x -> {
Long orgId = x.getOrgId();
Long siteId = x.getId();
SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId);
if (siteMemory == null) {
siteMemory = new SiteMemory();
GlobalMemory.addSiteMemory(orgId, siteId, siteMemory);
}
});
}
// 未执行完的重复计划
LambdaQueryWrapperX<DevicePlan> query = new LambdaQueryWrapperX<>();
List<String> list = Arrays.asList(DeviceTaskStaus.NEW.getCode(),DeviceTaskStaus.EXECUTING.getCode(), DeviceTaskStaus.PAUSE.getCode());
List<String> list = Arrays.asList(DeviceTaskStaus.NEW.getCode(), DeviceTaskStaus.EXECUTING.getCode(), DeviceTaskStaus.PAUSE.getCode());
query.in(DevicePlan::getTaskStaus, list);
List<DevicePlan> devicePlanList = devicePlanMapper.selectList(query);
if(!CollectionUtils.isEmpty(devicePlanList)){
devicePlanList.forEach(SiteMemory::addDevicePlan);
if (!CollectionUtils.isEmpty(devicePlanList)) {
devicePlanList.forEach(x -> {
Long orgId = x.getOrgId();
Long siteId = x.getSiteId();
SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId);
siteMemory.addDevicePlan(x);
});
}
// 未执行完的重复计划
LambdaQueryWrapperX<DevicePlanTask> taskQuery = new LambdaQueryWrapperX<>();
taskQuery.eq(DevicePlanTask::getTaskStaus, DeviceTaskStaus.NEW.getCode());
List<DevicePlanTask> newStatusList = devicePlanTaskMapper.selectList(taskQuery);
if (!CollectionUtils.isEmpty(newStatusList)) {
newStatusList.forEach(x -> {
Long orgId = x.getOrgId();
Long siteId = x.getSiteId();
SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId);
siteMemory.addDevicePlanPrepare(x);
});
}
LambdaQueryWrapperX<DevicePlanTask> executeTaskQuery = new LambdaQueryWrapperX<>();
executeTaskQuery.eq(DevicePlanTask::getTaskStaus, DeviceTaskStaus.EXECUTING.getCode());
List<DevicePlanTask> executeStatusList = devicePlanTaskMapper.selectList(executeTaskQuery);
if (!CollectionUtils.isEmpty(executeStatusList)) {
executeStatusList.forEach(x -> {
Long orgId = x.getOrgId();
Long siteId = x.getSiteId();
SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId);
siteMemory.addDevicePlanExecute(x);
});
}
}
}

View File

@@ -4,6 +4,7 @@ import com.maibu.common.CommandConstant;
import com.maibu.common.Constant;
import com.maibu.core.business.Device;
import com.maibu.core.business.device.NettyDevice;
import com.maibu.core.business.path.LatAndLngEntity;
import com.maibu.core.domain.entity.SysUser;
import com.maibu.core.domain.entity.UserClient;
import com.maibu.core.enums.*;
@@ -36,6 +37,7 @@ import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;
@Component
@@ -301,15 +303,22 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler<String> {
}
}
}
} else if (cmdType == CommandConstant.path) {
//路径下发完成
if(bytes.length < 11){
//01 表示完成
if (bytes[5] == (byte) 0x01) {
Channel channel = ctx.channel();
String deviceId = channel.attr(Constant.ATT_DEVICE_ID).get();
NettyDevice device = sessionManager.getDevice(deviceId);
if(CollectionUtils.isEmpty(device.getLocationQueue())) {
device.finishTask();
}else{
device.sendNextPoint();
}
}
}
}
// else if (cmdType == CommandConstant.path) {
// Channel channel = ctx.channel();
// String deviceId = channel.attr(ATT_DEVICE_ID).get();
// NettyDevice device = sessionManager.getDevice(deviceId);
// if(CollectionUtils.isEmpty(device.getLocationQueue())) return;
// Queue<LatAndLngEntity> locationQueue = device.getLocationQueue();
//
// }
ctx.fireChannelRead(msg); // 如有其他 handler 需要处理
} catch (Exception e) {
logger.error("deviceConnect channelRead:{}", e.getMessage());

View File

@@ -5,13 +5,14 @@ import com.maibu.core.business.DevicePlan;
import com.maibu.core.business.DevicePlanTask;
import com.maibu.core.business.DeviceTaskPlanRule;
import com.maibu.core.business.WorkRecord;
import com.maibu.core.business.device.NettyDevice;
import com.maibu.core.enums.DeviceTaskPlanRepeatType;
import com.maibu.core.enums.DeviceTaskStaus;
import com.maibu.core.business.device.NettyDevice;
import com.maibu.manager.DeviceSessionManager;
import com.maibu.mapper.DevicePlanMapper;
import com.maibu.mapper.DevicePlanTaskMapper;
import com.maibu.mapper.WorkRecordMapper;
import com.maibu.memory.GlobalMemory;
import com.maibu.memory.SiteMemory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -32,10 +33,6 @@ import java.util.concurrent.TimeUnit;
@Service
public class DevicePlanTaskMonitorService {
@Autowired
private SiteMemory siteMemory;
@Autowired
private DevicePlanTaskMapper devicePlanTaskMapper;
@@ -108,7 +105,10 @@ public class DevicePlanTaskMonitorService {
devicePlanTask.setRouteId(devicePlan.getRouteId());
devicePlanTask.setCreateTime(LocalDateTime.now());
devicePlanTask.setTaskType("");//待拓展任务类型
devicePlanTask.setOrgId(devicePlan.getOrgId());
devicePlanTask.setSiteId(devicePlan.getSiteId());
devicePlanTaskMapper.insert(devicePlanTask);
SiteMemory siteMemory = GlobalMemory.getSiteMemory(devicePlan.getOrgId(), devicePlan.getSiteId());
siteMemory.addDevicePlanPrepare(devicePlanTask);
//啥时候重置?每日0点?
devicePlan.setDayTriggerFlag(true);
@@ -120,7 +120,7 @@ public class DevicePlanTaskMonitorService {
if (endTime != null && endTime.isEqual(today)) {
devicePlan.setFinishTime(LocalDateTime.now());
devicePlan.setTaskStaus(DeviceTaskStaus.FINISH);
SiteMemory.removeDevicePlan(devicePlan);
siteMemory.removeDevicePlan(devicePlan);
}
devicePlanMapper.updateById(devicePlan);
}
@@ -141,8 +141,11 @@ public class DevicePlanTaskMonitorService {
devicePlanTask.setTaskStaus(DeviceTaskStaus.NEW);
devicePlanTask.setRouteId(devicePlan.getRouteId());
devicePlanTask.setCreateTime(LocalDateTime.now());
devicePlanTask.setOrgId(devicePlan.getOrgId());
devicePlanTask.setSiteId(devicePlan.getSiteId());
devicePlanTask.setTaskType("");//待拓展任务类型
devicePlanTaskMapper.insert(devicePlanTask);
SiteMemory siteMemory = GlobalMemory.getSiteMemory(devicePlan.getOrgId(), devicePlan.getSiteId());
siteMemory.addDevicePlanPrepare(devicePlanTask);
//啥时候重置?每日0点?
devicePlan.setDayTriggerFlag(true);
@@ -153,7 +156,7 @@ public class DevicePlanTaskMonitorService {
if (endTime != null && endTime.isEqual(today)) {
devicePlan.setFinishTime(LocalDateTime.now());
devicePlan.setTaskStaus(DeviceTaskStaus.FINISH);
SiteMemory.removeDevicePlan(devicePlan);
siteMemory.removeDevicePlan(devicePlan);
}
devicePlanMapper.updateById(devicePlan);
}
@@ -174,7 +177,10 @@ public class DevicePlanTaskMonitorService {
devicePlanTask.setRouteId(devicePlan.getRouteId());
devicePlanTask.setCreateTime(LocalDateTime.now());
devicePlanTask.setTaskType("");//待拓展任务类型
devicePlanTask.setOrgId(devicePlan.getOrgId());
devicePlanTask.setSiteId(devicePlan.getSiteId());
devicePlanTaskMapper.insert(devicePlanTask);
SiteMemory siteMemory = GlobalMemory.getSiteMemory(devicePlan.getOrgId(), devicePlan.getSiteId());
siteMemory.addDevicePlanPrepare(devicePlanTask);
//啥时候重置?每日0点?
devicePlan.setDayTriggerFlag(true);
@@ -185,7 +191,7 @@ public class DevicePlanTaskMonitorService {
if (endTime != null && endTime.isEqual(today)) {
devicePlan.setFinishTime(LocalDateTime.now());
devicePlan.setTaskStaus(DeviceTaskStaus.FINISH);
SiteMemory.removeDevicePlan(devicePlan);
siteMemory.removeDevicePlan(devicePlan);
}
devicePlanMapper.updateById(devicePlan);
}
@@ -202,31 +208,37 @@ public class DevicePlanTaskMonitorService {
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(() -> {
try {
Map<String, List<DevicePlanTask>> planMap = SiteMemory.devicePlanTaskPrepareMap;
if (!CollectionUtils.isEmpty(planMap.keySet())) {
planMap.keySet().forEach(key -> {
NettyDevice device = deviceSessionManager.getDevice(key);
//判断是否能进execute
if (device != null && device.getCurrentTaskId() == null && device.getOnlineStatus() != null && device.getOnlineStatus() == 1) {
List<DevicePlanTask> list = planMap.get(key);
if (!CollectionUtils.isEmpty(list)) {
list.removeIf(Objects::isNull);
list.sort(
Comparator.comparing(
DevicePlanTask::getStartTime,
Comparator.nullsLast(Comparator.naturalOrder())
)
);
if (!CollectionUtils.isEmpty(list)) {
DevicePlanTask devicePlanTask = list.get(0);
String deviceId = devicePlanTask.getDeviceId();
if (!StringUtils.isEmpty(deviceId) && deviceId.equals(key)) {
SiteMemory.addDevicePlanExecute(devicePlanTask);
device.setCurrentTaskId(devicePlanTask.getId());
SiteMemory.removeDevicePlanPrepare(devicePlanTask);
List<SiteMemory> list = GlobalMemory.getAllSiteMemory();
if (!CollectionUtils.isEmpty(list)) {
list.forEach(siteMemory -> {
Map<String, List<DevicePlanTask>> planMap = siteMemory.devicePlanTaskPrepareMap;
if (!CollectionUtils.isEmpty(planMap.keySet())) {
planMap.keySet().forEach(key -> {
NettyDevice device = deviceSessionManager.getDevice(key);
//判断是否能进execute
if (device != null && device.getCurrentTaskId() == null && device.getOnlineStatus() != null && device.getOnlineStatus() == 1) {
List<DevicePlanTask> tasks = planMap.get(key);
if (!CollectionUtils.isEmpty(tasks)) {
tasks.removeIf(Objects::isNull);
tasks.sort(
Comparator.comparing(
DevicePlanTask::getStartTime,
Comparator.nullsLast(Comparator.naturalOrder())
)
);
if (!CollectionUtils.isEmpty(tasks)) {
DevicePlanTask devicePlanTask = tasks.get(0);
String deviceId = devicePlanTask.getDeviceId();
if (!StringUtils.isEmpty(deviceId) && deviceId.equals(key)) {
siteMemory.addDevicePlanExecute(devicePlanTask);
device.setCurrentTaskId(devicePlanTask.getId());
device.setTask(devicePlanTask);
siteMemory.removeDevicePlanPrepare(devicePlanTask);
}
}
}
}
}
});
}
});
}
@@ -241,26 +253,18 @@ public class DevicePlanTaskMonitorService {
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(() -> {
try {
Map<String, DevicePlanTask> planMap = SiteMemory.devicePlanTaskExecuteMap;
if (!CollectionUtils.isEmpty(planMap.keySet())) {
planMap.keySet().forEach(key -> {
NettyDevice device = deviceSessionManager.getDevice(key);
if (device != null && device.getCurrentTaskId() == null && device.getOnlineStatus() != null && device.getOnlineStatus() == 1) {
DevicePlanTask devicePlanTask = planMap.get(key);
if (devicePlanTask != null && DeviceTaskStaus.NEW.equals(devicePlanTask.getTaskStaus())) {
devicePlanTask.setTaskStaus(DeviceTaskStaus.EXECUTING);
//todo 任务结束的逻辑,执行完路线规划更新 任务完成
Long routId = devicePlanTask.getRouteId();
WorkRecord workRecord = workRecordMapper.selectWorkRecordById(routId);
if (workRecord != null) {
//todo 执行转化 并更新到nettyDevice
//todo 更新到device
}
List<SiteMemory> list = GlobalMemory.getAllSiteMemory();
list.forEach(siteMemory -> {
Map<String, DevicePlanTask> planMap = siteMemory.devicePlanTaskExecuteMap;
if (!CollectionUtils.isEmpty(planMap.keySet())) {
planMap.keySet().forEach(key -> {
NettyDevice device = deviceSessionManager.getDevice(key);
if (device != null && !device.isExecutingTask() && device.getTask() != null) {
device.startTask();
}
}
});
}
});
}
});
} catch (Exception e) {
log.error("执行任务execute线程错误", e);
}

View File

@@ -2,16 +2,14 @@ package com.maibu.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.maibu.core.business.*;
import com.maibu.core.business.device.NettyDevice;
import com.maibu.core.domain.entity.SysSite;
import com.maibu.core.domain.model.LoginUser;
import com.maibu.core.enums.DeviceTaskStaus;
import com.maibu.dto.DevicePlanStatisticsDTO;
import com.maibu.dto.DevicePlanTaskStatisticsDTO;
import com.maibu.dto.DeviceTaskQueryDTO;
import com.maibu.dto.DeviceWorkStatisticsDTO;
import com.maibu.mapper.DeviceMapper;
import com.maibu.mapper.DevicePlanMapper;
import com.maibu.mapper.DevicePlanTaskMapper;
import com.maibu.mapper.WorkRecordMapper;
import com.maibu.dto.*;
import com.maibu.manager.DeviceSessionManager;
import com.maibu.mapper.*;
import com.maibu.memory.GlobalMemory;
import com.maibu.memory.SiteMemory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -24,6 +22,7 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Random;
import java.util.stream.Collectors;
@@ -44,14 +43,22 @@ public class DeviceTaskService {
private WorkRecordMapper workRecordMapper;
@Autowired
private DeviceSessionManager deviceSessionManager;
@Autowired
private SysSiteMapper sysSiteMapper;
public int insertOrUpdate(DevicePlan devicePlan, LoginUser loginUser) {
Long id = devicePlan.getId();
SiteMemory siteMemory = GlobalMemory.getSiteMemory(devicePlan.getOrgId(), devicePlan.getSiteId());
if (id != null) {
devicePlan.setUpdateBy(loginUser.getUsername());
devicePlan.setUpdateTime(LocalDateTime.now());
transferDays(devicePlan);
int i = devicePlanMapper.updateById(devicePlan);
SiteMemory.addDevicePlan(devicePlan);
siteMemory.addDevicePlan(devicePlan);
return i;
} else {
devicePlan.setTaskStaus(DeviceTaskStaus.NEW);
@@ -59,7 +66,7 @@ public class DeviceTaskService {
devicePlan.setCreateBy(loginUser.getUsername());
transferDays(devicePlan);
int i = devicePlanMapper.insert(devicePlan);
SiteMemory.addDevicePlan(devicePlan);
siteMemory.addDevicePlan(devicePlan);
return i;
}
}
@@ -109,19 +116,44 @@ public class DeviceTaskService {
}
}
public List<DevicePlan> getSiteDevicePlan(Long siteId, LocalDate startTime, LocalDate endTime, String deviceId, DeviceTaskStaus taskStaus) {
if (siteId != null) {
LambdaQueryWrapper<DevicePlan> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DevicePlan::getSiteId, siteId);
if (taskStaus != null) {
queryWrapper.eq(DevicePlan::getTaskStaus, taskStaus);
}
if (!StringUtils.isEmpty(deviceId)) {
queryWrapper.eq(DevicePlan::getDeviceId, deviceId);
}
if (startTime != null && endTime != null) {
queryWrapper.between(DevicePlan::getCreateTime, startTime, endTime);
}
return transferDevicePlanData(devicePlanMapper.selectList(queryWrapper));
} else {
return new ArrayList<>();
}
}
public List<DevicePlan> getDeviceTask(DeviceTaskQueryDTO dto) {
if (dto != null) {
LambdaQueryWrapper<DevicePlan> queryWrapper = new LambdaQueryWrapper<>();
if (dto.getUserId() != null) {
queryWrapper.eq(DevicePlan::getUserId, dto.getUserId());
}
if (dto.getDeviceId() != null) {
if (!StringUtils.isEmpty(dto.getDeviceId())) {
queryWrapper.eq(DevicePlan::getDeviceId, dto.getDeviceId());
}
if (dto.getTaskStaus() != null) {
queryWrapper.eq(DevicePlan::getTaskStaus, dto.getTaskStaus());
}
if (dto.getPlanName() != null) {
if (dto.getOrgId() != null) {
queryWrapper.eq(DevicePlan::getOrgId, dto.getOrgId());
}
if (dto.getSiteId() != null) {
queryWrapper.eq(DevicePlan::getSiteId, dto.getSiteId());
}
if (!StringUtils.isEmpty(dto.getPlanName())) {
queryWrapper.like(DevicePlan::getPlanName, dto.getPlanName());
}
queryWrapper.eq(DevicePlan::getDelFlag, 0);
@@ -143,9 +175,9 @@ public class DeviceTaskService {
public int delete(Long id) {
DevicePlan planTask = devicePlanMapper.selectById(id);
if (planTask != null) {
planTask.setDelFlag(1);
SiteMemory.removeDevicePlan(planTask);
return devicePlanMapper.updateById(planTask);
SiteMemory siteMemory = GlobalMemory.getSiteMemory(planTask.getOrgId(), planTask.getSiteId());
siteMemory.removeDevicePlan(planTask);
return devicePlanMapper.deleteById(id);
}
return 0;
}
@@ -181,7 +213,7 @@ public class DeviceTaskService {
LambdaQueryWrapper<DevicePlan> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ge(DevicePlan::getCreateTime, monthStart)
.le(DevicePlan::getCreateTime, monthEnd)
.eq(DevicePlan::getUserId,userId);
.eq(DevicePlan::getUserId, userId);
List<DevicePlan> devicePlans = transferDevicePlanData(devicePlanMapper.selectList(queryWrapper));
if (!CollectionUtils.isEmpty(devicePlans)) {
List<LocalDate> dates = getMonthDays();
@@ -235,17 +267,17 @@ public class DeviceTaskService {
);
// 4. 构建 LambdaQueryWrapper 进行范围查询
LambdaQueryWrapper<DevicePlan> query = new LambdaQueryWrapper<>();
query.eq(DevicePlan::getUserId,userId);
query.eq(DevicePlan::getUserId, userId);
List<DevicePlan> devicePlans = transferDevicePlanData(devicePlanMapper.selectList(query));
if(CollectionUtils.isEmpty(devicePlans)) return new ArrayList<>();
if (CollectionUtils.isEmpty(devicePlans)) return new ArrayList<>();
List<Long> planIds = devicePlans.stream().map(DevicePlan::getId).collect(Collectors.toList());
if(CollectionUtils.isEmpty(planIds)) return new ArrayList<>();
if (CollectionUtils.isEmpty(planIds)) return new ArrayList<>();
LambdaQueryWrapper<DevicePlanTask> queryWrapper = new LambdaQueryWrapper<>();
// 核心:筛选 createTime 大于等于起始时间,且小于等于结束时间
queryWrapper.ge(DevicePlanTask::getCreateTime, monthStart)
.le(DevicePlanTask::getCreateTime, monthEnd)
.in(DevicePlanTask::getPlanId,planIds);
.in(DevicePlanTask::getPlanId, planIds);
List<DevicePlanTask> devicePlanTasks = transferDeviceTaskData(devicePlanTaskMapper.selectList(queryWrapper));
if (!CollectionUtils.isEmpty(devicePlanTasks)) {
List<LocalDate> dates = getMonthDays();
@@ -275,7 +307,7 @@ public class DeviceTaskService {
.eq(DevicePlanTask::getTaskStaus, DeviceTaskStaus.EXECUTING);
List<DevicePlanTask> devicePlanTasks = devicePlanTaskMapper.selectList(queryWrapper);
Long routId = CollectionUtils.isEmpty(devicePlanTasks) ? null : devicePlanTasks.get(0).getRouteId();
return routId == null ? null : workRecordMapper.selectWorkRecordById(routId);
return routId == null ? null : workRecordMapper.selectById(routId);
}
@@ -304,22 +336,56 @@ public class DeviceTaskService {
public List<DevicePlanTask> deviceTaskPool(DeviceTaskQueryDTO dto) {
List<DevicePlanTask> list = new ArrayList<>();
SiteMemory.devicePlanTaskPrepareMap.values().forEach(list::addAll);
list.addAll(SiteMemory.devicePlanTaskExecuteMap.values());
if (dto != null) {
if (dto.getTaskStaus() != null) {
list = list.stream().filter(x -> x.getTaskStaus().equals(dto.getTaskStaus())).collect(Collectors.toList());
}
if (!StringUtils.isEmpty(dto.getDeviceId())) {
list = list.stream().filter(x -> x.getDeviceId().equals(dto.getDeviceId())).collect(Collectors.toList());
}
if (dto.getPlanId() != null) {
list = list.stream().filter(x -> x.getPlanId().equals(dto.getPlanId())).collect(Collectors.toList());
if (dto.getOrgId() == null) {
SysSite site = sysSiteMapper.selectById(dto.getSiteId());
if (site != null) {
dto.setOrgId(site.getOrgId());
}
}
SiteMemory siteMemory = GlobalMemory.getSiteMemory(dto.getOrgId(), dto.getSiteId());
siteMemory.devicePlanTaskPrepareMap.values().forEach(list::addAll);
list.addAll(SiteMemory.devicePlanTaskExecuteMap.values());
if (dto.getTaskStaus() != null) {
list = list.stream().filter(x -> x.getTaskStaus().equals(dto.getTaskStaus())).collect(Collectors.toList());
}
if (!StringUtils.isEmpty(dto.getDeviceId())) {
list = list.stream().filter(x -> x.getDeviceId().equals(dto.getDeviceId())).collect(Collectors.toList());
}
if (dto.getPlanId() != null) {
list = list.stream().filter(x -> x.getPlanId().equals(dto.getPlanId())).collect(Collectors.toList());
}
if (dto.getSiteId() != null) {
list = list.stream().filter(x -> x.getSiteId().equals(dto.getSiteId())).collect(Collectors.toList());
}
if (dto.getOrgId() != null) {
list = list.stream().filter(x -> x.getOrgId().equals(dto.getOrgId())).collect(Collectors.toList());
}
if (!StringUtils.isEmpty(dto.getDeviceId())) {
list = list.stream().filter(x -> x.getDeviceId().equals(dto.getDeviceId())).collect(Collectors.toList());
}
return transferDeviceTaskData(list);
}
public List<DevicePlanTask> getSiteDeviceTaskHistory(DeviceTaskQueryDTO dto) {
LambdaQueryWrapper<DevicePlanTask> queryWrapper = new LambdaQueryWrapper<>();
if (dto.getSiteId() != null) {
queryWrapper.eq(DevicePlanTask::getSiteId, dto.getSiteId());
}
if (dto.getOrgId() != null) {
queryWrapper.eq(DevicePlanTask::getOrgId, dto.getOrgId());
}
if (dto.getTaskStaus() != null) {
queryWrapper.eq(DevicePlanTask::getTaskStaus, dto.getTaskStaus());
}
if (dto.getPlanId() != null) {
queryWrapper.eq(DevicePlanTask::getPlanId, dto.getPlanId());
}
if (!StringUtils.isEmpty(dto.getDeviceId())) {
queryWrapper.eq(DevicePlanTask::getDeviceId, dto.getDeviceId());
}
return transferDeviceTaskData(devicePlanTaskMapper.selectList(queryWrapper));
}
public List<DevicePlan> transferDevicePlanData(List<DevicePlan> list) {
if (CollectionUtils.isEmpty(list)) return list;
@@ -339,4 +405,95 @@ public class DeviceTaskService {
return list;
}
public boolean createDeviceTask(DeviceTaskCommandDTO dto, String username) {
DevicePlanTask task = new DevicePlanTask();
task.setOrgId(dto.getOrgId());
task.setSiteId(dto.getSiteId());
task.setTaskStaus(DeviceTaskStaus.NEW);
task.setDeviceId(dto.getDeviceId());
task.setCreateBy(username);
task.setCreateTime(LocalDateTime.now());
task.setRouteId(dto.getRouteId());
task.setStartTime(dto.getStartTime());
boolean result = devicePlanTaskMapper.saveOrUpdate(task);
if (dto.getOrgId() == null) {
SysSite site = sysSiteMapper.selectById(dto.getSiteId());
if (site != null) {
dto.setOrgId(site.getOrgId());
}
}
SiteMemory siteMemory = GlobalMemory.getSiteMemory(task.getOrgId(), task.getSiteId());
siteMemory.addDevicePlanPrepare(task);
return result;
}
public boolean cancelTask(DeviceTaskCommandDTO dto, String username) {
if (!StringUtils.isEmpty(dto.getDeviceId())) {
NettyDevice device = deviceSessionManager.getDevice(dto.getDeviceId());
if (device != null) {
return device.cancelTask();
}
} else {
Long taskId = dto.getTaskId();
Long siteId = dto.getSiteId();
Long orgId = dto.getOrgId();
DevicePlanTask devicePlanTask = devicePlanTaskMapper.selectById(taskId);
if (devicePlanTask != null) {
devicePlanTask.setUpdateTime(LocalDateTime.now());
devicePlanTask.setTaskStaus(DeviceTaskStaus.CANCELED);
devicePlanTask.setUpdateBy(username);
devicePlanTaskMapper.saveOrUpdate(devicePlanTask);
SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId);
siteMemory.removeDevicePlanPrepare(devicePlanTask);
siteMemory.removeDevicePlanExecute(devicePlanTask.getDeviceId());
}
}
return false;
}
//todo 完善
public boolean pauseTask(DeviceTaskCommandDTO dto, String username) {
if (!StringUtils.isEmpty(dto.getDeviceId())) {
NettyDevice device = deviceSessionManager.getDevice(dto.getDeviceId());
if (device != null) {
return device.pauseTask();
}
} else {
Long taskId = dto.getTaskId();
DevicePlanTask devicePlanTask = devicePlanTaskMapper.selectById(taskId);
if (devicePlanTask != null) {
devicePlanTask.setUpdateTime(LocalDateTime.now());
devicePlanTask.setTaskStaus(DeviceTaskStaus.PAUSE);
devicePlanTask.setUpdateBy(username);
devicePlanTaskMapper.saveOrUpdate(devicePlanTask);
}
}
return false;
}
//todo 完善
public boolean recoveryTask(DeviceTaskCommandDTO dto, String username) {
if (!StringUtils.isEmpty(dto.getDeviceId())) {
NettyDevice device = deviceSessionManager.getDevice(dto.getDeviceId());
if (device != null) {
return device.recoveryTask();
}
} else {
Long taskId = dto.getTaskId();
Long siteId = dto.getSiteId();
Long orgId = dto.getOrgId();
DevicePlanTask devicePlanTask = devicePlanTaskMapper.selectById(taskId);
SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId);
DevicePlanTask executeTask = siteMemory.getDeviceExecuteTask(devicePlanTask.getDeviceId());
if (Objects.equals(devicePlanTask.getId(), executeTask.getId())) {
devicePlanTask.setUpdateTime(LocalDateTime.now());
devicePlanTask.setTaskStaus(DeviceTaskStaus.EXECUTING);
devicePlanTask.setUpdateBy(username);
devicePlanTaskMapper.saveOrUpdate(devicePlanTask);
}
}
return false;
}
}