Commit 5ef3e0a2 authored by Zheng Yi Fan's avatar Zheng Yi Fan

refactor(opt): 重构路口状态分布接口

- 修改接口参数,使用 condition 替代 directionName,支持更多筛选条件
- 优化接口返回值结构,使用 Map<String, Object> 包含多个结果列表
- 新增 getCrossStatusDistribution_SingleCondition 方法处理单条件查询
- 重构原有 getCrossStatusDistribution 方法,支持多条件查询
- 优化查询逻辑,提高接口响应性能
parent f223e189
......@@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.servicev2.CrossService;
import net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity;
import net.wanji.opt.synthesis.pojo.CrossStatusDisOptTimeEntity;
import net.wanji.opt.vo2.CrossBaseInfoVO;
import net.wanji.opt.vo2.CrossRealTimeAlarmVO;
import net.wanji.opt.vo2.CrossStatusDistributionVO;
......@@ -14,7 +15,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -37,56 +37,23 @@ public class CrossController {
@ApiImplicitParam(name = "groupType", value = "时间粒度 0--5分钟 1--15分钟 2--30分钟 3--60分钟", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "date", value = "日期 格式:yyyy-MM-dd", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "objectType", value = "范围 1:方向级指标 2:转向级指标 3:车道级指标 4:路口级指标", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "directionName", value = "方向 支持 北进口;东进口;南进口;西进口", dataType = "String", defaultValue = ""),
@ApiImplicitParam(name = "condition", value = "筛选条件", dataType = "String", paramType = "query"),
})
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = CrossStatusDistributionVO.class),
})
public JsonViewObject getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String directionName) {
public JsonViewObject getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String condition) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
Map<String, Object> map = new HashMap<>();
if (directionName != null) {
String[] dirs = directionName.split(";");
for (String dir : dirs) {
String dirName = "";
switch (dir) {
case "北进口":
dirName = "northList";
break;
case "南进口":
dirName = "southList";
break;
case "西进口":
dirName = "westList";
break;
case "东进口":
dirName = "eastList";
break;
}
try {
List<CrossStatusDistributionVO> info = crossService.getCrossStatusDistribution(crossID, date, groupType, objectType, dir);
map.put(dirName, info);
} catch (Exception e) {
log.error("监测详情-路口事件详情-路口状态分布: ", e);
return jsonViewObject.fail("路口状态分布查询失败");
}
}
} else {
try {
List<CrossStatusDistributionVO> info = crossService.getCrossStatusDistribution(crossID, date, groupType, objectType, null);
map.put("infoList", info);
} catch (Exception e) {
log.error("监测详情-路口事件详情-路口状态分布: ", e);
return jsonViewObject.fail("路口状态分布查询失败");
}
try {
Map<String, Object> result = crossService.getCrossStatusDistribution(crossID, date, groupType, objectType, condition);
List<CrossStatusDisOptTimeEntity> optTimes = crossService.getOptTimeList(crossID);
result.put("optTimesList", optTimes);
return jsonViewObject.success(result);
} catch (Exception e) {
log.error("监测详情-路口事件详情-路口状态分布: ", e);
return jsonViewObject.fail("路口状态分布查询失败");
}
map.put("optTimeList", crossService.getOptTimeList(crossID));
return jsonViewObject.success(map);
}
@ApiOperation(value = "路口实时告警", notes = "路口实时告警", response = JsonViewObject.class, httpMethod="GET")
......
......@@ -6,6 +6,7 @@ import net.wanji.opt.vo2.CrossBaseInfoVO;
import net.wanji.opt.vo2.CrossStatusDistributionVO;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -21,10 +22,23 @@ public interface CrossService {
* @param date 日期
* @param groupType 时间粒度 参数要求:0--5分钟 1--15分钟 2--30分钟 3--60分钟
* @param objectType 范围 参数要求:1--方向级 2--转向级 3--车道级 4--路口级
* @param directionName 方向
* @param condition 筛选条件-根据范围参数确定
* @return 包含状态分布信息列表与优化时间列表
*/
List<CrossStatusDistributionVO> getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String directionName);
Map<String, Object> getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String condition);
/**
* 获取路口状态分布_单状态
*
* @param crossID 路口ID
* @param date 日期
* @param groupType 时间粒度 参数要求:0--5分钟 1--15分钟 2--30分钟 3--60分钟
* @param objectType 范围 参数要求:1--方向级 2--转向级 3--车道级 4--路口级
* @param condition 筛选条件-根据范围参数确定
* @return 包含状态分布信息列表与优化时间列表
*/
List<CrossStatusDistributionVO> getCrossStatusDistribution_SingleCondition(String crossID, String date, String groupType, Integer objectType, String condition);
/**
* 获取路口实时告警
......
......@@ -2,7 +2,6 @@ package net.wanji.opt.servicev2.implv2;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.opt.dao.mapper.CrossMapper;
import net.wanji.opt.dao.mapper.GreenwaveHistoryMapper;
import net.wanji.opt.po.base.CrossLaneDataHistPoExtend;
......@@ -13,10 +12,7 @@ import net.wanji.opt.vo2.CrossStatusDistributionVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* <p>
......@@ -33,27 +29,62 @@ public class CrossServiceImpl implements CrossService {
@Resource
private GreenwaveHistoryMapper greenwaveHistoryMapper;
@Override
public Map<String, Object> getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String condition) {
Map<String, Object> resultMap = new HashMap<>();
if (objectType == 1) {
// 方向级
// condition是方向--1 3 5 7
String[] conditions = condition.split(";");
for (String c : conditions) {
List<CrossStatusDistributionVO> list = getCrossStatusDistribution_SingleCondition(crossID, date, groupType, objectType, c);
resultMap.put(c + "_list", list);
}
} else if (objectType == 2) {
// 转向级
// condition是转向--l r n u
String[] conditions = condition.split(";");
for (String c : conditions) {
List<CrossStatusDistributionVO> list = getCrossStatusDistribution_SingleCondition(crossID, date, groupType, objectType, c);
resultMap.put(c + "_list", list);
}
} else if (objectType == 3) {
// 车道级
// condition是车道序号
String[] conditions = condition.split(";");
for (String c : conditions) {
List<CrossStatusDistributionVO> list = getCrossStatusDistribution_SingleCondition(crossID, date, groupType, objectType, c);
resultMap.put(c + "_list", list);
}
} else if (objectType == 4) {
// 路口级
// 无condition
List<CrossStatusDistributionVO> list = getCrossStatusDistribution_SingleCondition(crossID, date, groupType, objectType, "");
resultMap.put("cross_list", list);
}
return resultMap;
}
/**
* 路口状态分布
* 路口状态分布_单条件
*
* @param crossID 路口ID
* @param date 日期
* @param groupType 时间粒度 参数要求:0--5分钟 1--15分钟 2--30分钟 3--60分钟
* @param objectType 范围 参数要求:1--方向级 2--转向级 3--车道级 4--路口级
* @param directionName 方向 东南西北
* @return
* @param condition 条件
*/
@Override
public List<CrossStatusDistributionVO> getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String directionName) {
public List<CrossStatusDistributionVO> getCrossStatusDistribution_SingleCondition(String crossID, String date, String groupType, Integer objectType, String condition) {
Map<String, Object> params = new HashMap<>();
params.put("crossId", crossID);
params.put("startDate", date + " 00:00:00");
params.put("endDate", date + " 23:59:59");
params.put("groupType", groupType);
params.put("objectType", objectType);
if (StringUtils.isNotBlank(directionName)) {
params.put("dir", BaseEnum.SignalDirectionEnum.getCodeByName(directionName.substring(0, directionName.indexOf("进口"))));
}
// 方向级时多传一个dir参数
if (objectType == 1) params.put("dir", condition);
List<CrossLaneDataHistPoExtend> firstList = greenwaveHistoryMapper.findCrossObjectIndex(params);
List<CrossStatusDistributionVO> results = new ArrayList<>();
......@@ -73,9 +104,16 @@ public class CrossServiceImpl implements CrossService {
cd.setLaneNo(c.getLaneNo());
results.add(cd);
}
// 根据筛选条件筛选一次结果
if (objectType == 2) {
// 转向级
results.removeIf(c -> !Objects.equals(c.getTurnType(), BaseEnum.TurnTypeEnum.getIntCodeByStrCode(condition)));
} else if (objectType == 3) {
// 车道级
results.removeIf(c -> c.getLaneNo() != Integer.parseInt(condition));
}
return results;
}
......
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