Commit c16350de authored by Zheng Yi Fan's avatar Zheng Yi Fan

监测详情-路口事件-路口状态分布趋势接口

parent b77b94b0
package net.wanji.opt.controllerv2;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.servicev2.CrossService;
import net.wanji.opt.synthesis.pojo.CrossStatusDisOptTimeEntity;
import net.wanji.opt.vo2.CrossStatusDistributionVO;
import org.springframework.http.HttpMethod;
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;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author zhengyifan
* @date 2025/3/15
*/
@Api(value = "CrossController", description = "监测详情-路口事件详情-路口状态分布")
@RequestMapping(value = "/cross")
@RestController
@Slf4j
public class CrossController {
@Resource
private CrossService crossService;
@ApiOperation(value = "路口状态分布", notes = "路口状态分布", response = JsonViewObject.class, httpMethod="GET")
@ApiImplicitParams({
@ApiImplicitParam(name = "crossID", value = "路口ID", required = true, dataType = "String", paramType = "query"),
@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 = "方向", required = false, dataType = "String",defaultValue = "北进口"),
})
@GetMapping(value = "/getCrossStatusDistribution")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = CrossStatusDistributionVO.class),
})
public JsonViewObject getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, @RequestParam(defaultValue = "") String directionName, HttpMethod httpMethod) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
Map<String, List<?>> result;
try {
result = crossService.getCrossStatusDistribution(crossID, date, groupType, objectType, directionName);
} catch (Exception e) {
log.error("监测详情-路口事件详情-路口状态分布: ", e);
return jsonViewObject.fail("路口状态分布查询失败");
}
return jsonViewObject.success(result);
}
}
package net.wanji.opt.dao.mapper;
import net.wanji.databus.po.CrossDataHistPO;
import net.wanji.opt.synthesis.pojo.CrossStatusDisOptTimeEntity;
import net.wanji.opt.synthesis.pojo.StrategyCrossResultEntity;
import java.util.List;
import java.util.Map;
/**
* <p>
* 监测详情-路口事件详情
* </p>
* @author zhengyifan
* @date 2025/3/15
*/
public interface CrossMapper {
/**
* 监测详情-路口事件详情-路口状态分布趋势-优化时间
* @param crossID 路口ID
* @return
*/
List<CrossStatusDisOptTimeEntity> getOptTimes(String crossID);
}
package net.wanji.opt.servicev2;
import net.wanji.opt.vo2.CrossStatusDistributionVO;
import java.util.List;
import java.util.Map;
/**
* <p>
* 监测详情-路口事件详情
* </p>
* @author zhengyifan
* @date 2025/3/15
*/
public interface CrossService {
/**
* 获取路口状态分布
* @param crossID 路口ID
* @param date 日期
* @param groupType 时间粒度 参数要求:0--5分钟 1--15分钟 2--30分钟 3--60分钟
* @param objectType 范围 参数要求:1--方向级 2--转向级 3--车道级 4--路口级
* @param directionName 方向
* @return 包含状态分布信息列表与优化时间列表
*/
Map<String, List<?>> getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String directionName);
}
package net.wanji.opt.servicev2.implv2;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
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;
import net.wanji.opt.servicev2.CrossService;
import net.wanji.opt.synthesis.pojo.CrossStatusDisOptTimeEntity;
import net.wanji.opt.synthesis.pojo.StrategyCrossResultEntity;
import net.wanji.opt.vo2.CrossStatusDistributionVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Resource;
import java.util.*;
/**
* <p>
* 监测详情-路口事件详情-路口状态分布实现类
* </p>
* @author zhengyifan
* @date 2025/3/15
*/
@Service
@Slf4j
public class CrossServiceImpl implements CrossService {
@Resource
private CrossMapper crossMapper;
@Resource
private GreenwaveHistoryMapper greenwaveHistoryMapper;
@Override
public Map<String, List<?>> getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String directionName) {
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("进口"))));
}
List<CrossLaneDataHistPoExtend> firstList = greenwaveHistoryMapper.findCrossObjectIndex(params);
List<CrossStatusDisOptTimeEntity> optTimeList = crossMapper.getOptTimes(crossID);
List<CrossStatusDistributionVO> infoList = new ArrayList<>();
for (CrossLaneDataHistPoExtend c : firstList) {
CrossStatusDistributionVO info = new CrossStatusDistributionVO();
info.setSpeed(c.getSpeed());
info.setQueueLength(c.getAvgQueueLength());
info.setDelayTime(c.getDelayTime());
info.setStopTimes(c.getStopTimes());
info.setStartTime(c.getStartTime().toString().substring(11,16));
infoList.add(info);
}
Map<String, List<?>> result = new HashMap<>();
result.put("infoList", infoList);
result.put("optTimeList", optTimeList);
return result;
}
}
package net.wanji.opt.synthesis.pojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 监测详情-路口事件详情-路口状态分布趋势-优化时间
*/
@Data
public class CrossStatusDisOptTimeEntity {
private String startTime;
private String endTime;
}
package net.wanji.opt.vo2;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.opt.synthesis.pojo.CrossStatusDisOptTimeEntity;
import java.util.Date;
import java.util.List;
@Data
@ApiModel(value = "CrossStatusDistributionVO", description = "监测详情-路口事件详情-路口状态分布")
public class CrossStatusDistributionVO {
@ApiModelProperty(value = "平均速度")
private Double speed;
@ApiModelProperty(value = "排队长度")
private Integer queueLength;
@ApiModelProperty(value = "平均延误")
private Integer delayTime;
@ApiModelProperty(value = "平均停车次数")
private Double stopTimes;
@ApiModelProperty(value = "时间")
private String startTime;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.CrossMapper">
<resultMap id="BaseResultMap" type="net.wanji.opt.synthesis.pojo.CrossStatusDisOptTimeEntity">
<result property="startTime" column="startTime"></result>
<result property="endTime" column="endTime"></result>
</resultMap>
<select id="getOptTimes" resultMap="BaseResultMap" parameterType="String">
select distinct DATE_FORMAT(issue_time, '%H:%i') as startTime,
DATE_FORMAT(newtime, '%H:%i') as endTime
from
(
select
a.issue_time,
DATE_ADD(a.issue_time, interval a.count_down second) newTime
from
t_strategy_cross_result a
where
1 = 1
and a.cross_id = #{crossID}
and sign(a.rtn_type) = -1
and a.current_algo = 1
and a.issue_time >= CURDATE()
union
select
a.issue_time,
DATE_ADD(a.issue_time, interval a.duration second) newTime
from
t_strategy_cross_result a
where
1 = 1
and a.cross_id = #{crossID}
and a.current_algo = 2
and a.response_code = 200
and a.issue_time >= CURDATE()
union
select
a.issue_time,
DATE_ADD(a.issue_time , interval a.duration second) newTime
from
t_strategy_cross_result a
where
1 = 1
and a.cross_id = #{crossID}
and a.current_algo = 3
and a.response_code = 200
and a.issue_time >= CURDATE()
) b
order by b.issue_time
</select>
</mapper>
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