Commit f99cb8d9 authored by hanbing's avatar hanbing

[add] 信号评价,路口详情

parent 67e21c6b
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.dto.CrossIdDTO;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.service.EvaluateService;
import net.wanji.opt.vo.EvaluateCrossDetailVO;
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;
/**
* 信号评价
*
* @author Kent HAN
*/
@Api(value = "EvaluateController", description = "信号评价")
@RequestMapping("/evaluate")
@RestController
public class EvaluateController {
private final EvaluateService evaluateService;
public EvaluateController(EvaluateService evaluateService) {
this.evaluateService = evaluateService;
}
@ApiOperation(value = "路口详情", notes = "路口详情", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/evaluateCrossDetail",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = EvaluateCrossDetailVO.class),
})
public JsonViewObject evaluateCrossDetail(@RequestBody CrossIdDTO crossIdDTO) {
EvaluateCrossDetailVO evaluateCrossDetailVO = evaluateService.evaluateCrossDetail(crossIdDTO);
return JsonViewObject.newInstance().success(evaluateCrossDetailVO);
}
}
\ No newline at end of file
package net.wanji.opt.service;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.opt.vo.EvaluateCrossDetailVO;
/**
* @author hanbing
* @date 2023/1/12 15:12
* @desc 信号评价接口服务
*/
public interface EvaluateService {
EvaluateCrossDetailVO evaluateCrossDetail(CrossIdDTO crossIdDTO);
}
package net.wanji.opt.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper;
import net.wanji.opt.dao.mapper.trend.CrossDataRealtimeMapper;
import net.wanji.opt.dto.OptDataExtend;
import net.wanji.opt.po.base.CrossInfoPO;
import net.wanji.opt.po.base.CrossSchemeOptLogPO;
import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.service.EvaluateService;
import net.wanji.opt.vo.EvaluateCrossDetailVO;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/3/10 10:47
*/
@Service
@Slf4j
public class EvaluateServiceImpl implements EvaluateService {
private final CrossInfoMapper crossInfoMapper;
private final CrossSchemeOptLogMapper crossSchemeOptLogMapper;
private final CrossDataRealtimeMapper crossDataRealtimeMapper;
private Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
public EvaluateServiceImpl(CrossInfoMapper crossInfoMapper, CrossSchemeOptLogMapper crossSchemeOptLogMapper, CrossDataRealtimeMapper crossDataRealtimeMapper) {
this.crossInfoMapper = crossInfoMapper;
this.crossSchemeOptLogMapper = crossSchemeOptLogMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper;
}
@Override
public EvaluateCrossDetailVO evaluateCrossDetail(CrossIdDTO crossIdDTO) {
EvaluateCrossDetailVO evaluateCrossDetailVO = new EvaluateCrossDetailVO();
String crossId = crossIdDTO.getCrossId();
CrossInfoPO crossInfoPO = crossInfoMapper.selectById(crossId);
String crossName = crossInfoPO.getName();
evaluateCrossDetailVO.setCrossName(crossName);
fillOptData(evaluateCrossDetailVO, crossId);
fillRealtimeData(evaluateCrossDetailVO, crossId);
return evaluateCrossDetailVO;
}
private void fillRealtimeData(EvaluateCrossDetailVO evaluateCrossDetailVO, String crossId) {
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId(crossId);
evaluateCrossDetailVO.setSceneStartTime(crossDataRealtimePO.getStartTime());
evaluateCrossDetailVO.setDuration(crossDataRealtimePO.getDuration());
// todo 服务水平定义
evaluateCrossDetailVO.setServiceLevel("D");
evaluateCrossDetailVO.setFlow(crossDataRealtimePO.getFlow());
evaluateCrossDetailVO.setLength(crossDataRealtimePO.getQueueLength());
evaluateCrossDetailVO.setStopTimes(crossDataRealtimePO.getStopTimes());
}
private void fillOptData(EvaluateCrossDetailVO evaluateCrossDetailVO, String crossId) {
// 选择数据批次时间最大的记录
List<CrossSchemeOptLogPO> maxList = crossSchemeOptLogMapper.selectMaxByCrossId(crossId);
if (CollectionUtil.isEmpty(maxList)) {
throw new RuntimeException("没有该路口优化日志数据");
}
CrossSchemeOptLogPO crossSchemeOptLogPO = maxList.get(0);
// 解析dataExtend
String dataExtend = crossSchemeOptLogPO.getDataExtend();
OptDataExtend optDataExtend = gson.fromJson(dataExtend, OptDataExtend.class);
evaluateCrossDetailVO.setSceneName(optDataExtend.getSceneName());
evaluateCrossDetailVO.setStrategyName(optDataExtend.getStrategyName());
evaluateCrossDetailVO.setIdeaName(optDataExtend.getIdeaName());
evaluateCrossDetailVO.setOptStartTime(crossSchemeOptLogPO.getStartTime());
Date endTime = crossSchemeOptLogPO.getEndTime();
if (ObjectUtil.isEmpty(endTime)) {
evaluateCrossDetailVO.setOptStatus(2);
} else {
evaluateCrossDetailVO.setOptStatus(1);
}
}
}
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;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "EvaluateCrossDetailVO", description = "信号评价路口详情")
public class EvaluateCrossDetailVO {
@ApiModelProperty(value = "路口名称")
private String crossName;
@ApiModelProperty(value = "当前场景")
private String sceneName;
@ApiModelProperty(value = "优化策略")
private String strategyName;
@ApiModelProperty(value = "优化方法")
private String ideaName;
@ApiModelProperty(value = "场景开始时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd HH:mm", timezone = "GMT+8")
private Date sceneStartTime;
@ApiModelProperty(value = "持续时间(单位:分钟)")
private Integer duration;
@ApiModelProperty(value = "优化开始时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd HH:mm", timezone = "GMT+8")
private Date optStartTime;
@ApiModelProperty(value = "优化状态 1已完成 2持续优化")
Integer optStatus;
@ApiModelProperty(value = "服务水平")
String serviceLevel;
@ApiModelProperty(value = "路口流量")
private Integer flow ;
@ApiModelProperty(value = "排队长度")
private Double length;
@ApiModelProperty(value = "停车次数(次)")
private Double stopTimes;
}
...@@ -28,7 +28,7 @@ public class OptEffectVO { ...@@ -28,7 +28,7 @@ public class OptEffectVO {
@ApiModelProperty(value = "优化开始时间 格式2023-03-02 10:10") @ApiModelProperty(value = "优化开始时间 格式2023-03-02 10:10")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
Date optStartTime; Date optStartTime;
@ApiModelProperty(value = "状态 1已完成 2优化中") @ApiModelProperty(value = "状态 1已完成 2持续优化")
Integer status; Integer status;
@ApiModelProperty(value = "拥堵指数延误折线图") @ApiModelProperty(value = "拥堵指数延误折线图")
List<IndexDelay> indexDelayList; List<IndexDelay> indexDelayList;
......
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