Commit 4756e4fc authored by hanbing's avatar hanbing

信控优化-态势监测,问题子区列表

parent 924b2e82
...@@ -14,7 +14,7 @@ import net.wanji.feign.pojo.vo.ManufacturerInfoOutVO; ...@@ -14,7 +14,7 @@ import net.wanji.feign.pojo.vo.ManufacturerInfoOutVO;
import net.wanji.feign.pojo.vo.ManufacturerVO; import net.wanji.feign.pojo.vo.ManufacturerVO;
import net.wanji.feign.service.UtcFeignClients; import net.wanji.feign.service.UtcFeignClients;
import net.wanji.web.common.enums.*; import net.wanji.web.common.enums.*;
import net.wanji.web.common.util.CrossUtil; import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.web.common.util.StringUtils; import net.wanji.web.common.util.StringUtils;
import net.wanji.web.dto.CrossIdNameDTO; import net.wanji.web.dto.CrossIdNameDTO;
import net.wanji.web.entity.*; import net.wanji.web.entity.*;
......
...@@ -7,7 +7,7 @@ import net.wanji.web.common.enums.CrossPhasePlanTurnTypeEnum; ...@@ -7,7 +7,7 @@ import net.wanji.web.common.enums.CrossPhasePlanTurnTypeEnum;
import net.wanji.web.common.enums.CrossDirEnum; import net.wanji.web.common.enums.CrossDirEnum;
import net.wanji.web.common.enums.SpecialServiceCrossTurnEnum; import net.wanji.web.common.enums.SpecialServiceCrossTurnEnum;
import net.wanji.web.common.exception.CrossRelationException; import net.wanji.web.common.exception.CrossRelationException;
import net.wanji.web.common.util.CrossUtil; import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.web.entity.TBaseCrossInfo; import net.wanji.web.entity.TBaseCrossInfo;
import net.wanji.web.mapper.*; import net.wanji.web.mapper.*;
import net.wanji.web.po.*; import net.wanji.web.po.*;
......
package net.wanji.opt.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.service.impl.TrendServiceImpl;
import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats;
import net.wanji.opt.vo.GreenwaveVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.ws.rs.core.MediaType;
import java.util.List;
/**
* 态势监测
*
* @author Kent HAN
*/
@Api(value = "TrendController", description = "态势监测")
@RequestMapping("/trend")
@RestController
public class TrendController {
private final TrendServiceImpl trendService;
public TrendController(TrendServiceImpl trendService) {
this.trendService = trendService;
}
@ApiOperation(value = "问题子区列表", notes = "问题子区列表", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/greenwaveList",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenwaveVO.class),
})
public JsonViewObject greenwaveList(@RequestBody GreenwaveListDTO greenwaveListDTO) {
GreenwaveVO greenwaveVO = new GreenwaveVO();
List<GreenwaveListVO> greenwaveListVOList = trendService.greenwaveList(greenwaveListDTO);
greenwaveVO.setGreenwaveList(greenwaveListVOList);
// 绿波统计信息
GreenwaveStats greenwaveStats = trendService.buildGreenwaveStats(greenwaveListVOList);
greenwaveVO.setGreenwaveStats(greenwaveStats);
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.success(greenwaveVO);
}
}
\ No newline at end of file
...@@ -20,4 +20,6 @@ public interface CrossInfoMapper { ...@@ -20,4 +20,6 @@ public interface CrossInfoMapper {
* @return * @return
*/ */
List<CrossInfoPO> listCrossInfo(CrossQuery query); List<CrossInfoPO> listCrossInfo(CrossQuery query);
List<CrossInfoPO> selectByCrossIds(List<String> crossIdList);
} }
package net.wanji.opt.dao.mapper.trend; package net.wanji.opt.dao.mapper.trend;
import net.wanji.opt.vo.GreenwaveListVO;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
/** /**
* 态势监测-绿波基础信息 * 态势监测-绿波基础信息
* *
...@@ -10,4 +13,7 @@ import org.springframework.stereotype.Repository; ...@@ -10,4 +13,7 @@ import org.springframework.stereotype.Repository;
*/ */
@Repository @Repository
public interface GreenwaveInfoMapper { public interface GreenwaveInfoMapper {
List<GreenwaveListVO> listGreenwave(Integer status, String name, Integer type);
List<String> selectCrossIdsById(String greenwaveId);
} }
package net.wanji.opt.dto.trend;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "GreenwaveListDTO", description = "问题子区列表")
public class GreenwaveListDTO {
@ApiModelProperty(value = "交通状态 0畅通 1缓行 2拥堵", notes = "", required = false)
private Integer status;
@ApiModelProperty(value = "子区名称", notes = "", required = false)
private String name;
@ApiModelProperty(value = "拥堵类型:1常发性;2偶发性", notes = "", required = false)
private Integer type;
}
package net.wanji.opt.service;
import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats;
import java.util.List;
/**
* @date 2023/1/12 15:12
* @desc 态势监测接口服务
*/
public interface TrendService {
List<GreenwaveListVO> greenwaveList(GreenwaveListDTO greenwaveListDTO);
GreenwaveStats buildGreenwaveStats(List<GreenwaveListVO> greenwaveListVOList);
}
package net.wanji.opt.service.impl;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper;
import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.po.base.CrossInfoPO;
import net.wanji.opt.service.TrendService;
import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/2/8 10:31
*/
@Service
public class TrendServiceImpl implements TrendService {
private final GreenwaveInfoMapper greenwaveInfoMapper;
private final CrossInfoMapper crossInfoMapper;
public TrendServiceImpl(GreenwaveInfoMapper greenwaveInfoMapper, CrossInfoMapper crossInfoMapper) {
this.greenwaveInfoMapper = greenwaveInfoMapper;
this.crossInfoMapper = crossInfoMapper;
}
@Override
public List<GreenwaveListVO> greenwaveList(GreenwaveListDTO greenwaveListDTO) {
Integer status = greenwaveListDTO.getStatus();
String name = greenwaveListDTO.getName();
Integer type = greenwaveListDTO.getType();
List<GreenwaveListVO> greenwaveListVOList = greenwaveInfoMapper.listGreenwave(status, name, type);
// 2以上都算拥堵
if (status != null && status == 2) {
List<GreenwaveListVO> extraList1 = greenwaveInfoMapper.listGreenwave(3, name, type);
changeStatus(extraList1);
List<GreenwaveListVO> extraList2 = greenwaveInfoMapper.listGreenwave(4, name, type);
changeStatus(extraList2);
greenwaveListVOList.addAll(extraList1);
greenwaveListVOList.addAll(extraList2);
}
for (GreenwaveListVO greenwaveListVO : greenwaveListVOList) {
// 计算持续时间
buildDuration(greenwaveListVO);
// 构造路口列表
String greenwaveId = greenwaveListVO.getId();
List<GreenwaveListVO.CrossListElement> crossList = buildCrossList(greenwaveId);
greenwaveListVO.setCrossList(crossList);
}
return greenwaveListVOList;
}
@Override
public GreenwaveStats buildGreenwaveStats(List<GreenwaveListVO> greenwaveListVOList) {
GreenwaveStats greenwaveStats = new GreenwaveStats();
Integer smooth = greenwaveStats.getSmooth();
Integer slow = greenwaveStats.getSlow();
Integer congestion = greenwaveStats.getCongestion();
for (GreenwaveListVO greenwaveListVO : greenwaveListVOList) {
Integer realtimeStatus = greenwaveListVO.getRealtimeStatus();
if (realtimeStatus == 0) {
smooth += 1;
} else if (realtimeStatus == 1) {
slow += 1;
} else if (realtimeStatus == 2) {
congestion += 1;
}
}
greenwaveStats.setSmooth(smooth);
greenwaveStats.setSlow(slow);
greenwaveStats.setCongestion(congestion);
return greenwaveStats;
}
private static void changeStatus(List<GreenwaveListVO> extraList1) {
if (extraList1 != null) {
for (GreenwaveListVO greenwaveListVO : extraList1) {
greenwaveListVO.setRealtimeStatus(2);
}
}
}
private List<GreenwaveListVO.CrossListElement> buildCrossList(String greenwaveId) {
List<GreenwaveListVO.CrossListElement> crossList = new ArrayList<>();
List<String> crossIdList = greenwaveInfoMapper.selectCrossIdsById(greenwaveId);
if (crossIdList != null) {
List<CrossInfoPO> crossInfoPOList = crossInfoMapper.selectByCrossIds(crossIdList);
for (CrossInfoPO crossInfoPO : crossInfoPOList) {
GreenwaveListVO.CrossListElement crossListElement = new GreenwaveListVO.CrossListElement();
crossListElement.setCrossId(crossInfoPO.getId());
crossListElement.setName(crossInfoPO.getName());
List<Double> location = buildLocation(crossInfoPO);
crossListElement.setLocation(location);
crossList.add(crossListElement);
}
}
return crossList;
}
private List<Double> buildLocation(CrossInfoPO crossInfoPO) {
String location = crossInfoPO.getLocation();
double[] lonLat = CrossUtil.getLonLat(location);
List<Double> res = new ArrayList<>();
res.add(lonLat[0]);
res.add(lonLat[1]);
return res;
}
private static void buildDuration(GreenwaveListVO greenwaveListVO) {
Date startTime = greenwaveListVO.getStartTime();
Date endTime = greenwaveListVO.getEndTime();
Long duration = null;
if (endTime != null) {
duration = DateUtil.between(startTime, endTime, DateUnit.MINUTE);
} else {
duration = DateUtil.between(startTime, new Date(), DateUnit.MINUTE);
}
greenwaveListVO.setDuration(duration);
}
}
package net.wanji.opt.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@NoArgsConstructor
@Data
@ApiModel(value = "GreenwaveListVO", description = "问题子区列表元素")
public class GreenwaveListVO {
@ApiModelProperty(value = "绿波ID")
private String id;
@ApiModelProperty(value = "子区名称")
private String name;
@ApiModelProperty(value = "协调方式")
private Integer infoStatus;
@ApiModelProperty(value = "路口状态:0畅通;1缓行;2拥堵")
private Integer realtimeStatus;
@ApiModelProperty(value = "拥堵指数")
private Double trafficIndex;
@ApiModelProperty(value = "开始时间 格式 08:20:23")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss")
private Date startTime;
@ApiModelProperty(value = "开始时间 格式 08:20:23")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss")
private Date endTime;
@ApiModelProperty(value = "持续时长 分钟")
private Long duration;
@ApiModelProperty(value = "区域边界")
private String polylines;
@ApiModelProperty(value = "路口列表")
private List<CrossListElement> crossList;
@NoArgsConstructor
@Data
public static class CrossListElement {
@ApiModelProperty(value = "路口ID")
private String crossId;
@ApiModelProperty(value = "路口名称")
private String name;
@ApiModelProperty(value = "路口坐标")
private List<Double> location;
}
}
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Kent HAN
* @date 2023/2/8 13:47
*/
@NoArgsConstructor
@Data
@ApiModel(value = "GreenwaveStats", description = "问题子区统计信息")
public class GreenwaveStats {
@ApiModelProperty(value = "畅通数量")
private Integer smooth = 0;
@ApiModelProperty(value = "缓行数量")
private Integer slow = 0;
@ApiModelProperty(value = "拥堵数量")
private Integer congestion = 0;
}
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@NoArgsConstructor
@Data
@ApiModel(value = "GreenwaveVO", description = "查询问题子区返回值")
public class GreenwaveVO {
@ApiModelProperty(value = "问题子区统计信息")
private GreenwaveStats greenwaveStats;
@ApiModelProperty(value = "问题子区列表")
private List<GreenwaveListVO> greenwaveList;
}
...@@ -41,4 +41,14 @@ ...@@ -41,4 +41,14 @@
</if> </if>
</select> </select>
<select id="selectByCrossIds" resultType="net.wanji.opt.po.base.CrossInfoPO">
select
id,name,type,level,area_code,is_signal,is_start,is_send,location
from t_base_cross_info
where id IN
<foreach collection="crossIdList" item="crossId" separator="," open="(" close=")">
#{crossId}
</foreach>
</select>
</mapper> </mapper>
...@@ -2,6 +2,28 @@ ...@@ -2,6 +2,28 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!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.trend.GreenwaveInfoMapper"> <mapper namespace="net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper">
<select id="listGreenwave" resultType="net.wanji.opt.vo.GreenwaveListVO">
select
t1.id, t1.name, t1.status as infoStatus, t2.status as realtimeStatus,
t2.traffic_index, t1.start_time, t1.end_time, t1.polylines
from t_greenwave_info t1 join t_greenwave_realtime t2 on t1.id = t2.id
<where>
<if test="status != null">
and t2.status = #{status}
</if>
<if test="name != null and name != ''">
and t1.name = like concat('%',#{name},'%')
</if>
<if test="type != null">
and t2.type = #{type}
</if>
</where>
</select>
<select id="selectCrossIdsById" resultType="java.lang.String">
SELECT DISTINCT cross_id
FROM t_greenwave_info t1 JOIN t_greenwave_cross t2
ON t1.id = t2.green_id
</select>
</mapper> </mapper>
package net.wanji.web.common.util; package net.wanji.common.utils.tool;
import java.util.List; import java.util.List;
......
package net.wanji.web.common.util; package net.wanji.common.utils.tool;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
......
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