查询任务及详情

This commit is contained in:
chenlinghy 2023-08-26 01:41:07 +08:00
parent a643cd1158
commit e4fdfd279d
18 changed files with 337 additions and 69 deletions

View File

@ -2,6 +2,10 @@ package com.zjyr.beidouservice.controller;
import com.zjyr.beidouservice.pojo.MyResp;
import com.zjyr.beidouservice.pojo.dto.AlarmDeviceTaskListRespDTO;
import com.zjyr.beidouservice.pojo.dto.AlarmTaskListRespDTO;
import com.zjyr.beidouservice.pojo.dto.task.AlarmDeviceTaskListReqDTO;
import com.zjyr.beidouservice.pojo.dto.task.AlarmTaskListReqDTO;
import com.zjyr.beidouservice.pojo.dto.task.AlarmTaskReqDTO;
import com.zjyr.beidouservice.service.AlarmTaskService;
import jakarta.annotation.Resource;
@ -33,5 +37,15 @@ public class DeviceTaskController {
return alarmTaskService.alarmTaskExec(alarmTaskReqDTO);
}
@PostMapping("/alarm/task/list")
public MyResp<AlarmTaskListRespDTO> alarmTaskList(@RequestBody AlarmTaskListReqDTO alarmTaskReqDTO) {
return MyResp.success(alarmTaskService.alarmTaskList(alarmTaskReqDTO));
}
@PostMapping("/alarm/device/task/list")
public MyResp<AlarmDeviceTaskListRespDTO> alarmDeviceTaskList(@RequestBody AlarmDeviceTaskListReqDTO alarmDeviceTaskListReqDTO) {
return MyResp.success(alarmTaskService.alarmDeviceTaskList(alarmDeviceTaskListReqDTO));
}
}

View File

@ -26,4 +26,6 @@ public interface AlarmDeviceTaskMapper {
List<AlarmDeviceTaskDO> getAlarmTaskByStatus(@Param("status") Integer status);
void batchUpdate(@Param("list") List<AlarmDeviceTaskDO> deviceTaskList);
List<AlarmDeviceTaskDO> selectAllByTaskIdStr(@Param("list") List<String> taskIdStrList);
}

View File

@ -1,7 +1,11 @@
package com.zjyr.beidouservice.mapper;
import com.zjyr.beidouservice.pojo.dataobject.AlarmTaskDO;
import com.zjyr.beidouservice.pojo.entry.SensorTask;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface AlarmTaskMapper {
@ -12,4 +16,6 @@ public interface AlarmTaskMapper {
* @return int
*/
long addAlarmTask(AlarmTaskDO alarmTaskDO);
List<AlarmTaskDO> selectAllByTaskIdStr(@Param("list") List<String> taskIdStrList);
}

View File

@ -15,7 +15,7 @@ public interface DeviceMapper {
List<DeviceDO> selectDeviceByLoc(DeviceByLocationDTO deviceByLocationDTO);
DeviceDO selectDeviceByDeviceId(@Param("deviceId") Long deviceId);
List<DeviceDO> selectDeviceByDeviceIds(@Param("ids") List<Integer> deviceIdList);
void batchUpdateDeviceAlarmStatus(@Param("ids") Set<Integer> alarmingDeviceIds, @Param("status") Integer code);
}

View File

@ -0,0 +1,48 @@
package com.zjyr.beidouservice.pojo.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zjyr.beidouservice.pojo.dataobject.AlarmDeviceTaskDO;
import com.zjyr.beidouservice.pojo.vo.PageInfoVO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AlarmDeviceTaskListRespDTO {
private List<AlarmDeviceTaskDTO> deviceList;
private PageInfoVO pageInfo;
@Data
public static class AlarmDeviceTaskDTO {
private Long taskId;
private Integer deviceId;
private String deviceName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date reportTime;
private Integer taskState;
/**
* 经度
*/
private Float latitude;
/**
* 纬度
*/
private Float longitude;
}
}

View File

@ -0,0 +1,43 @@
package com.zjyr.beidouservice.pojo.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zjyr.beidouservice.pojo.vo.PageInfoVO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AlarmTaskListRespDTO {
private List<AlarmTaskRespDTO> taskList;
private PageInfoVO pageInfo;
@Data
@Builder
public static class AlarmTaskRespDTO {
private Long id;
private String taskIdStr;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date recodeTime;
private Integer deviceNum;
private Integer execNormalNum;
private Integer execAbnormalNum;
private Double respRate;
}
}

View File

@ -13,5 +13,5 @@ public class DeviceSearchDTO {
/**
* 设备id
*/
private Long deviceId;
private Integer deviceId;
}

View File

@ -1,26 +0,0 @@
package com.zjyr.beidouservice.pojo.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeviceTaskContentDTO {
private Long deviceId;
private String deviceName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date respTime;
private Integer execState;
}

View File

@ -1,34 +0,0 @@
package com.zjyr.beidouservice.pojo.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeviceTaskRespDTO {
private Long id;
private String taskId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date recodeTime;
private Integer deviceNum;
private Integer execNormalNum;
private Integer execAbnormalNum;
private Double respRate;
private List<DeviceTaskContentDTO> data;
}

View File

@ -0,0 +1,15 @@
package com.zjyr.beidouservice.pojo.dto.task;
import lombok.Data;
import java.util.List;
@Data
public class AlarmDeviceTaskListReqDTO {
private Integer pageSize;
private Integer pageNum;
private List<String> taskIdStrList;
}

View File

@ -0,0 +1,15 @@
package com.zjyr.beidouservice.pojo.dto.task;
import lombok.Data;
import java.util.List;
@Data
public class AlarmTaskListReqDTO {
private Integer pageSize;
private Integer pageNum;
private List<String> taskIdStrList;
}

View File

@ -0,0 +1,19 @@
package com.zjyr.beidouservice.pojo.vo;
import lombok.Data;
@Data
public class PageInfoVO {
private Long total;
private Integer pageSize;
private Integer pageNum;
public PageInfoVO(Long total, Integer pageSize, Integer pageNum) {
this.total = total;
this.pageSize = pageSize;
this.pageNum = pageNum;
}
}

View File

@ -3,6 +3,10 @@ package com.zjyr.beidouservice.service;
import com.zjyr.beidouservice.pojo.MyResp;
import com.zjyr.beidouservice.pojo.dto.AlarmDeviceTaskListRespDTO;
import com.zjyr.beidouservice.pojo.dto.AlarmTaskListRespDTO;
import com.zjyr.beidouservice.pojo.dto.task.AlarmDeviceTaskListReqDTO;
import com.zjyr.beidouservice.pojo.dto.task.AlarmTaskListReqDTO;
import com.zjyr.beidouservice.pojo.dto.task.AlarmTaskReqDTO;
public interface AlarmTaskService {
@ -14,6 +18,7 @@ public interface AlarmTaskService {
MyResp alarmTaskExec(AlarmTaskReqDTO alarmTaskReqDTO);
AlarmTaskListRespDTO alarmTaskList(AlarmTaskListReqDTO alarmTaskReqDTO);
AlarmDeviceTaskListRespDTO alarmDeviceTaskList(AlarmDeviceTaskListReqDTO alarmDeviceTaskListReqDTO);
}

View File

@ -1,5 +1,7 @@
package com.zjyr.beidouservice.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zjyr.beidouservice.common.impl.AlarmControlTypeName;
import com.zjyr.beidouservice.common.impl.AlarmModeName;
import com.zjyr.beidouservice.common.impl.AlarmTypeName;
@ -19,9 +21,14 @@ import com.zjyr.beidouservice.pojo.dataobject.AlarmTaskDO;
import com.zjyr.beidouservice.pojo.dataobject.DeviceDO;
import com.zjyr.beidouservice.pojo.dataobject.LocCountyDO;
import com.zjyr.beidouservice.pojo.dataobject.SystemConfigDO;
import com.zjyr.beidouservice.pojo.dto.AlarmDeviceTaskListRespDTO;
import com.zjyr.beidouservice.pojo.dto.AlarmTaskListRespDTO;
import com.zjyr.beidouservice.pojo.dto.DeviceByLocationDTO;
import com.zjyr.beidouservice.pojo.dto.DeviceInfoDTO;
import com.zjyr.beidouservice.pojo.dto.task.AlarmDeviceTaskListReqDTO;
import com.zjyr.beidouservice.pojo.dto.task.AlarmTaskListReqDTO;
import com.zjyr.beidouservice.pojo.dto.task.AlarmTaskReqDTO;
import com.zjyr.beidouservice.pojo.vo.PageInfoVO;
import com.zjyr.beidouservice.service.AdapterProtocolService;
import com.zjyr.beidouservice.service.AlarmTaskService;
import com.zjyr.beidouservice.service.DeviceService;
@ -34,8 +41,11 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
@ -112,6 +122,130 @@ public class AlarmTaskServiceImpl implements AlarmTaskService {
}
@Override
public AlarmTaskListRespDTO alarmTaskList(AlarmTaskListReqDTO alarmTaskReqDTO) {
Integer pageNum = alarmTaskReqDTO.getPageNum();
Integer pageSize = alarmTaskReqDTO.getPageSize();
List<String> taskIdStrList = alarmTaskReqDTO.getTaskIdStrList();
// 分页查询
PageInfo<AlarmTaskDO> pageResult = queryAlarmTaskDOList(taskIdStrList, pageNum, pageSize);
// 初始的 task dto
List<AlarmTaskListRespDTO.AlarmTaskRespDTO> alarmTaskDOList = pageResult.getList().stream()
.map(s -> AlarmTaskListRespDTO.AlarmTaskRespDTO.builder()
.taskIdStr(s.getTaskIdStr())
.id(s.getId())
.recodeTime(s.getSendTime())
.build())
.toList();
List<AlarmDeviceTaskDO> deviceTaskList = getAggregatedAlarmDeviceTaskDOS(
alarmTaskDOList.stream()
.map(AlarmTaskListRespDTO.AlarmTaskRespDTO::getTaskIdStr)
.distinct()
.toList()
);
Map<Long, List<AlarmDeviceTaskDO>> deviceTaskMap = deviceTaskList.stream().collect(Collectors.groupingBy(AlarmDeviceTaskDO::getTaskId));
for (AlarmTaskListRespDTO.AlarmTaskRespDTO task : alarmTaskDOList) {
Long taskId = task.getId();
List<AlarmDeviceTaskDO> deviceTaskDOS = deviceTaskMap.getOrDefault(taskId, new ArrayList<>());
int successCount = (int) deviceTaskDOS.stream().filter(s -> TaskStatusName.TASK_OK.getValue().equals(s.getStatus())).count();
int failCount = (int) deviceTaskDOS.stream().filter(s -> TaskStatusName.TASK_ERROR.getValue().equals(s.getStatus())).count();
int timeoutCount = (int) deviceTaskDOS.stream().filter(s -> TaskStatusName.TASK_TIMEOUT.getValue().equals(s.getStatus())).count();
task.setDeviceNum(deviceTaskDOS.size());
task.setExecNormalNum(successCount + failCount);
task.setExecAbnormalNum(timeoutCount);
task.setRespRate((double) task.getExecNormalNum() / task.getDeviceNum());
}
PageInfoVO pageInfoVO = new PageInfoVO(pageResult.getTotal(), pageResult.getPageSize(), pageResult.getPageNum());
return AlarmTaskListRespDTO.builder()
.taskList(alarmTaskDOList)
.pageInfo(pageInfoVO)
.build();
}
@Override
public AlarmDeviceTaskListRespDTO alarmDeviceTaskList(AlarmDeviceTaskListReqDTO alarmDeviceTaskListReqDTO) {
Integer pageNum = alarmDeviceTaskListReqDTO.getPageNum();
Integer pageSize = alarmDeviceTaskListReqDTO.getPageSize();
List<String> taskIdStrList = alarmDeviceTaskListReqDTO.getTaskIdStrList();
List<AlarmDeviceTaskDO> result = getAggregatedAlarmDeviceTaskDOS(taskIdStrList);
// 执行中的不展示在详情页
result = result.stream().filter(s -> !TaskStatusName.TASK_EXECUTING.getValue().equals(s.getStatus())).collect(Collectors.toList());
PageInfoVO pageInfoVO = new PageInfoVO((long) result.size(), pageSize, pageNum);
// 分页
result = result.stream().skip((long) pageSize * (pageNum -1)).limit(pageSize).collect(Collectors.toList());
List<Integer> deviceIdList = result.stream().map(AlarmDeviceTaskDO::getDeviceId).distinct().toList();
// 查询设备信息
List<DeviceDO> deviceList = deviceMapper.selectDeviceByDeviceIds(deviceIdList);
Map<Integer, DeviceDO> deviceDOMap = deviceList.stream().collect(Collectors.toMap(DeviceDO::getDeviceId, s -> s));
List<AlarmDeviceTaskListRespDTO.AlarmDeviceTaskDTO> dtoList = result.stream()
.map(s -> {
AlarmDeviceTaskListRespDTO.AlarmDeviceTaskDTO dto = new AlarmDeviceTaskListRespDTO.AlarmDeviceTaskDTO();
DeviceDO device = deviceDOMap.getOrDefault(s.getDeviceId(), new DeviceDO());
dto.setDeviceName(device.getDeviceName());
dto.setLatitude(device.getLatitude());
dto.setLongitude(device.getLongitude());
dto.setTaskState(s.getStatus());
dto.setReportTime(s.getReportTime());
dto.setDeviceId(s.getDeviceId());
dto.setTaskId(s.getTaskId());
return dto;
}).toList();
return AlarmDeviceTaskListRespDTO.builder()
.pageInfo(pageInfoVO)
.deviceList(dtoList)
.build();
}
private List<AlarmDeviceTaskDO> getAggregatedAlarmDeviceTaskDOS(List<String> taskIdStrList) {
if (taskIdStrList.isEmpty()) {
return new ArrayList<>();
}
List<AlarmDeviceTaskDO> alarmDeviceTaskList = alarmDeviceTaskMapper.selectAllByTaskIdStr(taskIdStrList);
// 刷新每个device的任务状态
Map<String, List<AlarmDeviceTaskDO>> deviceTaskMap = alarmDeviceTaskList.stream()
.collect(Collectors.groupingBy(s -> String.format("%s-%s", s.getTaskId(), s.getDeviceId())));
List<AlarmDeviceTaskDO> result = new LinkedList<>();
for (Map.Entry<String, List<AlarmDeviceTaskDO>> entry : deviceTaskMap.entrySet()) {
List<AlarmDeviceTaskDO> relatedDOS = entry.getValue();
if (relatedDOS.size() == 1) {
result.addAll(relatedDOS);
continue;
}
// 有一个成功的视为全部成功
boolean hasSucceedDeviceTask = relatedDOS.stream().anyMatch(s -> TaskStatusName.TASK_OK.getValue().equals(s.getStatus()));
// 所有都超时的视为超时
boolean allTimeout = relatedDOS.stream().allMatch(s -> TaskStatusName.TASK_TIMEOUT.getValue().equals(s.getStatus()));
boolean allExecuting = relatedDOS.stream().allMatch(s -> TaskStatusName.TASK_EXECUTING.getValue().equals(s.getStatus()));
AlarmDeviceTaskDO resultDO = relatedDOS.get(0);
if (hasSucceedDeviceTask) {
resultDO.setStatus(TaskStatusName.TASK_OK.getValue());
} else if (allTimeout) {
resultDO.setStatus(TaskStatusName.TASK_TIMEOUT.getValue());
} else if (allExecuting) {
resultDO.setStatus(TaskStatusName.TASK_EXECUTING.getValue());
} else {
resultDO.setStatus(TaskStatusName.TASK_ERROR.getValue());
}
result.add(resultDO);
}
return result;
}
private PageInfo<AlarmTaskDO> queryAlarmTaskDOList(List<String> taskIdStrList, int page, int nItems) {
PageHelper.startPage(page, nItems);
List<AlarmTaskDO> alarmTaskList = alarmTaskMapper.selectAllByTaskIdStr(taskIdStrList);
PageInfo<AlarmTaskDO> pgInfo = new PageInfo<>(alarmTaskList);
PageHelper.clearPage();
return pgInfo;
}
private static List<AlarmDeviceTaskDO> getAlarmDeviceTaskDOS(AlarmTaskReqDTO alarmTaskReqDTO, DeviceInfoDTO deviceInfo, Long taskId) {
List<AlarmDeviceTaskDO> alarmDeviceTaskDOS = new ArrayList<>();
List<Integer> deviceIds = deviceInfo.getDeviceIds();

View File

@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@ -57,13 +58,13 @@ public class DeviceServiceImpl implements DeviceService {
public DeviceRespDTO getDeviceByDeviceId(DeviceSearchDTO deviceSearchDTO) {
log.info("get device info by deviceId: [{}]", deviceSearchDTO.getDeviceId());
DeviceDO deviceDO = deviceMapper.selectDeviceByDeviceId(deviceSearchDTO.getDeviceId());
if (deviceDO == null) {
List<DeviceDO> deviceDOList = deviceMapper.selectDeviceByDeviceIds(Collections.singletonList(deviceSearchDTO.getDeviceId()));
if (deviceDOList.isEmpty()) {
log.warn("根据deviceId未查找到设备信息");
return null;
}
return DeviceRespDTO.fromDO(deviceDO);
return DeviceRespDTO.fromDO(deviceDOList.get(0));
}
@Override

View File

@ -50,5 +50,17 @@
</foreach>
</update>
<select id="selectAllByTaskIdStr" resultMap="alarm_device_task">
select adt.* from alarm_device_task adt
join alarm_task atk on adt.task_id = atk.id
where 1 = 1
<if test="list != null and !list.isEmpty()">
and atk.task_id_str in
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</if>
</select>
</mapper>

View File

@ -44,5 +44,17 @@
</trim>
</insert>
<select id="selectAllByTaskIdStr" resultMap="alarm_task">
select * from alarm_task
where 1 = 1
<if test="list != null and !list.isEmpty()">
and task_id_str in
<foreach collection="list" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</if>
order by send_time desc
</select>
</mapper>

View File

@ -48,11 +48,13 @@
</select>
<select id="selectDeviceByDeviceId" resultType="com.zjyr.beidouservice.pojo.dataobject.DeviceDO"
parameterType="java.lang.Long" resultMap="device">
<select id="selectDeviceByDeviceIds" resultMap="device">
select *
from device
where device_id = #{deviceId}
where device_id in
<foreach collection="ids" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</select>
<update id="batchUpdateDeviceAlarmStatus">