Commit 5deaf475 authored by duanruiming's avatar duanruiming

[add] 优化监测-问题诊断优化

parent a0f14a10
package net.wanji.opt.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import net.wanji.common.utils.tool.StringUtils;
/**
* @author duanruiming
* @date 2025/01/07 20:24
*/
@Getter
@AllArgsConstructor
public enum EventInfoTypeEnum {
// 事件类型转化
PHASE_EMPTY(5, "701","相位空放"),
CROSS_UNBALANCE(1, "702","路口失衡"),
CROSS_OVERFLOW(3, "703","路口溢出"),
CROSS_DEADLOCK(4, "704","路口死锁"),
GREEN_SLOW(6, "705","干线-缓行"),
GREEN_CONGEST(7, "706","干线-拥堵"),
CROSS_CONGEST(2, "707","路口拥堵");
private Integer optType;
private String eventType;
private String desc;
/**
* 通过事件类型获取优化类型
* @param eventType
* @return
*/
public static Integer getOptType(String eventType) {
for (EventInfoTypeEnum value : EventInfoTypeEnum.values()) {
if (StringUtils.equalsIgnoreCase(eventType, value.getEventType())) {
return value.getOptType();
}
}
return null;
}
}
......@@ -15,11 +15,12 @@ import net.wanji.opt.po.trend.HoloEventInfoPO;
import net.wanji.opt.service.CrossIndexService;
import net.wanji.opt.vo.AIOptResultVO;
import net.wanji.opt.vo.CrossOptResult;
import net.wanji.opt.vo.crossStatusCountVO;
import net.wanji.opt.vo.CrossStatusCountVO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
......@@ -104,20 +105,20 @@ public class CrossIndexController {
return JsonViewObject.newInstance().success(results);
}
@ApiOperation(value = "问题诊断", notes = "优化监测-问题诊断", response = JsonViewObject.class,
@ApiOperation(value = "优化监测-问题诊断", notes = "优化监测-问题诊断", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@GetMapping(value = "/crossStatusCount")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = AddOrUpdateSceneDTO.class),
})
public JsonViewObject crossStatusCount(String crossId) {
crossStatusCountVO result = new crossStatusCountVO();
List<CrossStatusCountVO> results = new ArrayList<>();
try {
result = crossIndexService.crossStatusCount(crossId);
results = crossIndexService.crossStatusCount(crossId);
} catch (Exception e) {
JsonViewObject.newInstance().fail("优化监测-问题诊断");
}
return JsonViewObject.newInstance().success(result);
return JsonViewObject.newInstance().success(results);
}
@ApiOperation(value = "交通体检-路口监测-事件方向转向", notes = "交通体检-路口监测-事件方向转向", response = JsonViewObject.class,
......
......@@ -8,7 +8,7 @@ import net.wanji.databus.po.TBaseCrossInfo;
import net.wanji.opt.po.trend.HoloEventInfoPO;
import net.wanji.opt.vo.AIOptResultVO;
import net.wanji.opt.vo.CrossOptResult;
import net.wanji.opt.vo.crossStatusCountVO;
import net.wanji.opt.vo.CrossStatusCountVO;
import java.util.List;
import java.util.Map;
......@@ -28,7 +28,7 @@ public interface CrossIndexService {
List<AIOptResultVO> crossAIList() throws Exception;
crossStatusCountVO crossStatusCount(String crossId);
List<CrossStatusCountVO> crossStatusCount(String crossId) throws Exception;
HoloEventInfoPO crossEventDirTurn(String crossId) throws Exception;
/**
......
......@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.LocalDateTimeUtil;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.databus.dao.mapper.BaseCrossInfoMapper;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
......@@ -11,6 +12,7 @@ import net.wanji.databus.dao.mapper.CrossDirDataHistMapper;
import net.wanji.databus.dao.mapper.CrossDirDataRealtimeMapper;
import net.wanji.databus.po.*;
import net.wanji.opt.common.enums.CrossOptResultStrategyEnum;
import net.wanji.opt.common.enums.EventInfoTypeEnum;
import net.wanji.opt.common.enums.OptStatusEnum;
import net.wanji.opt.common.enums.StrategyControlEnum;
import net.wanji.opt.dao.mapper.HoloEventMapper;
......@@ -20,7 +22,8 @@ import net.wanji.opt.service.CrossIndexService;
import net.wanji.opt.synthesis.pojo.StrategyCrossResultEntity;
import net.wanji.opt.vo.AIOptResultVO;
import net.wanji.opt.vo.CrossOptResult;
import net.wanji.opt.vo.crossStatusCountVO;
import net.wanji.opt.vo.CrossStatusCountVO;
import org.apache.curator.drivers.EventTrace;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
......@@ -158,32 +161,49 @@ public class CrossIndexServiceImpl implements CrossIndexService {
}
@Override
public crossStatusCountVO crossStatusCount(String crossId) {
LocalDate currentDate = LocalDate.now();
LocalTime startTime = LocalTime.MIDNIGHT;
LocalDateTime startOfDay = LocalDateTime.of(currentDate, startTime);
LambdaQueryWrapper<StrategyCrossResultEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(StrategyCrossResultEntity::getCrossId, crossId);
queryWrapper.ge(StrategyCrossResultEntity::getIssueTime, startOfDay);
List<StrategyCrossResultEntity> list = strategyCrossResultMapper.selectList(queryWrapper);
crossStatusCountVO crossStatusCountVO = new crossStatusCountVO();
if (!CollectionUtils.isEmpty(list)) {
Map<Integer, List<StrategyCrossResultEntity>> listMap = list.stream().collect(Collectors.groupingBy(StrategyCrossResultEntity::getCurrentAlgo));
for (Map.Entry<Integer, List<StrategyCrossResultEntity>> entry : listMap.entrySet()) {
Integer currentAlgo = entry.getKey();
List<StrategyCrossResultEntity> value = entry.getValue();
if (Objects.equals(currentAlgo, CrossOptResultStrategyEnum.ONE.getCode())) {
crossStatusCountVO.setPhaseEmptyCount(value.size());
}
if (Objects.equals(currentAlgo, CrossOptResultStrategyEnum.TWO.getCode())) {
crossStatusCountVO.setUnbalanceCount(value.size());
}
if (Objects.equals(currentAlgo, CrossOptResultStrategyEnum.THREE.getCode())) {
crossStatusCountVO.setOverFlowCount(value.size());
public List<CrossStatusCountVO> crossStatusCount(String crossId) throws Exception {
List<CrossStatusCountVO> results = new ArrayList<>();
try {
LocalDate currentDate = LocalDate.now();
LocalTime startTime = LocalTime.MIDNIGHT;
LocalDateTime startOfDay = LocalDateTime.of(currentDate, startTime);
LambdaQueryWrapper<HoloEventInfoPO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(HoloEventInfoPO::getCrossId, crossId);
queryWrapper.ge(HoloEventInfoPO::getStartTime, startOfDay);
List<HoloEventInfoPO> holoEventInfoPOS = holoEventMapper.selectList(queryWrapper);
if (!CollectionUtils.isEmpty(holoEventInfoPOS)) {
Map<String, List<HoloEventInfoPO>> eventTypeMap = holoEventInfoPOS.stream().collect(Collectors.groupingBy(HoloEventInfoPO::getType));
for (Map.Entry<String, List<HoloEventInfoPO>> entry : eventTypeMap.entrySet()) {
String eventType = entry.getKey();
List<HoloEventInfoPO> value = entry.getValue();
// 过滤干线
if (StringUtils.equalsIgnoreCase(eventType, EventInfoTypeEnum.GREEN_SLOW.getEventType())
|| StringUtils.equalsIgnoreCase(eventType, EventInfoTypeEnum.GREEN_CONGEST.getEventType())) {
continue;
}
// 当前事件返回实体
CrossStatusCountVO crossStatusCountVO = new CrossStatusCountVO();
crossStatusCountVO.setType(EventInfoTypeEnum.getOptType(eventType));
crossStatusCountVO.setCount(value.size());
List<CrossStatusCountVO.DirTurn> dirTurns = new ArrayList<>();
if (!CollectionUtils.isEmpty(value)) {
for (HoloEventInfoPO holoEventInfoPO : value) {
CrossStatusCountVO.DirTurn dirTurn = new CrossStatusCountVO.DirTurn();
dirTurn.setDir(holoEventInfoPO.getDir());
dirTurn.setTurn(holoEventInfoPO.getTurn());
dirTurns.add(dirTurn);
}
}
crossStatusCountVO.setList(dirTurns);
results.add(crossStatusCountVO);
}
}
} catch (Exception e) {
log.error("优化监测-问题诊断查询异常:", e);
throw new RuntimeException(e);
}
return crossStatusCountVO;
return results;
}
@Override
......
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2024/12/11 22:50
* 优化监测问题诊断实体
*/
@Data
@ApiModel(description = "优化监测问题诊断实体")
public class CrossStatusCountVO {
@ApiModelProperty("事件类型 1失衡;2拥堵;3溢出;5相位空放")
private Integer type;
@ApiModelProperty("发生次数")
private Integer count;
@ApiModelProperty("事件方向转向列表")
private List<DirTurn> list;
@Data
public static class DirTurn {
@ApiModelProperty("方向1北.... 7西北")
private String dir;
@ApiModelProperty("转向 1左 2直 3右")
private String turn;
}
}
package net.wanji.opt.vo;
import lombok.Data;
/**
* @author duanruiming
* @date 2024/12/11 22:50
*/
@Data
public class crossStatusCountVO {
private int overFlowCount;
private int unbalanceCount;
private int phaseEmptyCount;
private int congestionCount;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment