Commit 1f051dd4 authored by wangyecheng's avatar wangyecheng

Merge remote-tracking branch 'origin/master'

parents 8fc6cb0f 67556959
......@@ -6,6 +6,7 @@ import net.wanji.databus.po.BaseCrossInfoPO;
import net.wanji.databus.vo.CrossInfoVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
......@@ -20,6 +21,7 @@ import java.util.stream.Collectors;
* @date 2023/03/14 10:42
*/
@Component
@Order(1)
@Slf4j
public class BaseCrossInfoCache implements CommandLineRunner {
......
package net.wanji.opt.common;
/**
* @author duanruiming
* @date 2025/04/02 15:44
*/
public class CommonUtils {
/**
* 分隔符:下划线
**/
public static final String SEPARATOR_UNDER_LINE = "_";
public static String getStrJoin(String ... str) {
String join = String.join(SEPARATOR_UNDER_LINE, str);
return join;
}
}
......@@ -65,10 +65,16 @@ public class EsDateIndexUtil {
* @return
*/
public static List<String> getTimeGranularityAxisAll(String groupType,String startTime, String endTime) {
//DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 15 ) * 15 ),'%Y-%m-%d %H:%i:00' )
//存放时段
List<String> sortedSet = new ArrayList<>();
//===========================根据开始、结束时间输出完整时刻点=================================================//
DateTime start = DateTime.parse(startTime, DateTimeFormat.forPattern(EsDateIndexUtil.YMD_HM_FORMATTER));
//对于输入时间不是整5分钟情况,规约到5分钟
String formatStartDate = startTime.substring(0,startTime.indexOf(" ")+1) + Tools.fillZeroFront(start.getHourOfDay()+"",2)+":"+Tools.fillZeroFront((int)Math.ceil(start.getMinuteOfHour()/5)*5+"",2)+":00";
start = DateTime.parse(formatStartDate, DateTimeFormat.forPattern(EsDateIndexUtil.YMD_HM_FORMATTER));
DateTime end = DateTime.parse(endTime, DateTimeFormat.forPattern(EsDateIndexUtil.YMD_HM_FORMATTER));
if (Objects.equals("0", groupType)) {
sortedSet.addAll(EsDateIndexUtil.getTimeScopeList(start, end, TimeGranularityEnum.FIVE_MINUTE, "yyyy-MM-dd HH:mm:00"));
......@@ -285,11 +291,13 @@ public class EsDateIndexUtil {
// DateTime start = DateTime.now().withTimeAtStartOfDay();
// DateTime end = DateTime.now();
// List<String> indexByTime = EsDateIndexUtil.getTimeScopeList(start, end, TimeGranularityEnum.ONE_HOUR,"HH:mm");
String start = "2025-03-21 00:00:00";
String startTime = "2025-03-21 00:23:00";
String end = "2025-03-21 23:00:00";
List<String> indexByTime = EsDateIndexUtil.getTimeGranularityAxisAll("1",start, end);
DateTime start = DateTime.parse(startTime, DateTimeFormat.forPattern(EsDateIndexUtil.YMD_HM_FORMATTER));
String formatStartDate = startTime.substring(0,startTime.indexOf(" ")+1) + Tools.fillZeroFront(start.getHourOfDay()+"",2)+":"+Tools.fillZeroFront((int)Math.floor(start.getMinuteOfHour()/5)*5+"",2)+":00";
System.out.println(indexByTime);
System.out.println(formatStartDate);
}
......
......@@ -28,7 +28,7 @@ import java.util.List;
@RestController
@Slf4j
@RequestMapping("/green-wave-cross-rid")
@Api(value="GreenWaveCrossRidController", description="干线分析报告接口", tags = "干线分析报告")
@Api(value="GreenWaveCrossRidController", description="干线分析报告接口", tags = "干线分析报告-周报")
public class GreenWaveCrossRidController {
@Autowired
......@@ -36,7 +36,7 @@ public class GreenWaveCrossRidController {
@ApiOperation(httpMethod="GET",value="干线拥堵信息", notes="")
@ApiOperation(httpMethod="GET",value="1.1-干线拥堵信息", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔", required = true, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "dayType", value = "高峰类型 1早高峰 2晚高峰 3全天", required = true, dataType = "String",defaultValue = "1"),
......@@ -56,7 +56,7 @@ public class GreenWaveCrossRidController {
return jsonViewObject;
}
@ApiOperation(httpMethod="GET",value="干线基础信息", notes="")
@ApiOperation(httpMethod="GET",value="1.1-干线基础信息", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔", required = true, dataType = "String",defaultValue = "1,2"),
})
......
......@@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
@RequestMapping("/green-wave-overview")
@Api(value="GreenWaveCrossRidController", description="干线分析报告接口", tags = "干线分析报告")
@Api(value="GreenWaveCrossRidController", description="干线分析报告接口", tags = "干线分析报告-周报")
public class GreenWaveOverviewController {
@Autowired
......@@ -39,7 +39,7 @@ public class GreenWaveOverviewController {
@ApiOperation(httpMethod="GET",value="干线概况-总体情况说明", notes="")
@ApiOperation(httpMethod="GET",value="2.1-干线概况-总体情况说明", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔【为空时查询所有干线】", required = true, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String",defaultValue = "2025"),
......@@ -62,7 +62,7 @@ public class GreenWaveOverviewController {
@ApiOperation(httpMethod="GET",value="干线概况-工作日同期对比", notes="")
@ApiOperation(httpMethod="GET",value="2.2-干线概况-工作日同期对比", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔", required = true, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String",defaultValue = "2025"),
......
package net.wanji.opt.controllerv2.report;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.i18n.I18nResourceBundle;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.controllerv2.report.design.GreenReportOverviewAnalysisResult;
import net.wanji.opt.controllerv2.report.design.GreenReportProblemDetailAnalysis;
import net.wanji.opt.controllerv2.report.design.GreenReportProblemOverallAnalysis;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 干线概况 接口API
* </p>
* @version 1.0
* @author
* @Date 2025-03-18
*/
@RestController
@Slf4j
@RequestMapping("/green-wave-problem")
@Api(value="GreenWaveProblemAnalysisController", description="干线分析报告接口", tags = "干线分析报告-周报")
public class GreenWaveProblemAnalysisController {
@ApiOperation(httpMethod="GET",value="4.1-干线问题-总体分析", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔【为空时查询所有干线】", required = true, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String",defaultValue = "2025"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "20"),
})
@GetMapping(value = "/getProblemData")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenReportProblemOverallAnalysis.class),
})
public JsonViewObject getGreenInfoList(Integer year,Integer week, String ids) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try {
} catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
}
return jsonViewObject;
}
//GreenReportProblemDetailAnalysis
@ApiOperation(httpMethod="GET",value="4.2-干线问题-问题详情", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔【为空时查询所有干线】", required = true, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String",defaultValue = "2025"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "20"),
})
@GetMapping(value = "/getProblemDetail")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenReportProblemDetailAnalysis.class),
})
public JsonViewObject getProblemDetail(Integer year,Integer week, String ids) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try {
} catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
}
return jsonViewObject;
}
}
package net.wanji.opt.controllerv2.report;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.i18n.I18nResourceBundle;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.controllerv2.report.design.GreenReportOverviewAnalysisResult;
import net.wanji.opt.controllerv2.report.design.GreenReportRunStateResult;
import net.wanji.opt.controllerv2.report.design.GreenReportSamePeriodCompareResult;
import net.wanji.opt.servicev2.report.GreenWaveCrossRidService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 干线概况 接口API
* </p>
* @version 1.0
* @author
* @Date 2025-03-18
*/
@RestController
@Slf4j
@RequestMapping("/green-wave-run-state")
@Api(value="GreenWaveRunStateController", description="干线分析报告接口", tags = "干线分析报告-周报")
public class GreenWaveRunStateController {
@ApiOperation(httpMethod="GET",value="3.1-干线运行分析", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔【为空时查询所有干线】", required = true, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String",defaultValue = "2025"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "20"),
})
@GetMapping(value = "/getData")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenReportRunStateResult.class),
})
public JsonViewObject getData(Integer year,Integer week, String ids) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try {
} catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
}
return jsonViewObject;
}
}
......@@ -11,13 +11,13 @@ import java.util.List;
@Data
public class GreenReportOverviewAnalysisResult extends ParentResult {
private GreenReportOverviewResultResponse content;
private List<GreenReportOverviewResultResponse> content;
public GreenReportOverviewResultResponse getContent() {
public List<GreenReportOverviewResultResponse> getContent() {
return content;
}
public GreenReportOverviewAnalysisResult setContent(GreenReportOverviewResultResponse content) {
public GreenReportOverviewAnalysisResult setContent(List<GreenReportOverviewResultResponse> content) {
this.content = content;
return this;
}
......@@ -81,6 +81,9 @@ class GreenReportOverview {
@ApiModelProperty(value = "本周拥堵时段集中分布情况",example = "周一7:30~8:15,周五17:30~18:15")
private String weekCongestTimeDistribute;
@ApiModelProperty(value = "拥堵严重干线",example = "经十路(舜耕路-山大路)、经十路(洪山路-舜华路)")
private String congestHeavyGreenWave;
}
......
package net.wanji.opt.controllerv2.report.design;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.ParentResult;
import java.util.ArrayList;
import java.util.List;
@Data
public class GreenReportProblemDetailAnalysis extends ParentResult {
private List<GreenReportProblemDetailAnalysisResponse> content;
public List<GreenReportProblemDetailAnalysisResponse> getContent() {
return content;
}
public GreenReportProblemDetailAnalysis setContent(List<GreenReportProblemDetailAnalysisResponse> content) {
this.content = content;
return this;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
@Data
class GreenReportProblemDetailAnalysisResponse {
@ApiModelProperty(value = "干线工作日拥堵时段分布情况", example = "7:00~8:00,12:00~13:30,17:30~18:40")
private String workDayCongestSpan;
@ApiModelProperty(value = "干线工作日平均拥堵时长", example = "1小时")
private String workDayAvgCongestTime;
@ApiModelProperty(value = "干线工作日平均拥堵指数",example = "3.5")
private String workDayAvgCongestIndex;
//================================================================================================//
@ApiModelProperty(value = "干线工作日缓行时段分布情况", example = "7:00~8:00,12:00~13:30,17:30~18:40")
private String workDaySlowRunSpan;
@ApiModelProperty(value = "干线工作日平均缓行时长", example = "0.5小时")
private String workDayAvgSlowRunTime;
@ApiModelProperty(value = "干线工作日缓行平均拥堵指数",example = "3.5")
private String workDayAvgSlowAvgCongestIndex;
//================================================================================================//
@ApiModelProperty(value = "干线周末拥堵时段分布情况", example = "7:00~8:00,12:00~13:30,17:30~18:40")
private String weekEndCongestSpan;
@ApiModelProperty(value = "干线周末平均拥堵时长", example = "1小时")
private String weekEndAvgCongestTime;
@ApiModelProperty(value = "干线周末平均拥堵指数",example = "3.5")
private String weekEndAvgCongestIndex;
//================================================================================================//
@ApiModelProperty(value = "干线周末缓行时段分布情况", example = "7:00~8:00,12:00~13:30,17:30~18:40")
private String weekEndSlowRunSpan;
@ApiModelProperty(value = "干线周末平均缓行时长", example = "0.5小时")
private String weekEndAvgSlowRunTime;
@ApiModelProperty(value = "干线周末缓行平均拥堵指数",example = "3.5")
private String weekEndAvgSlowAvgCongestIndex;
private List<GreenReportProblemDetail> dataList = new ArrayList<>();
}
@Data
class GreenReportProblemDetail {
@ApiModelProperty(value = "星期", example = "周一")
private String week;
@ApiModelProperty(value = "问题时段", example = "7:35~8:40")
private String problemSpan;
@ApiModelProperty(value = "状态:缓行/拥堵", example = "拥堵")
private String status;
@ApiModelProperty(value = "拥堵指数", example = "4.5")
private Double congestIndex;
@ApiModelProperty(value = "平均速度", example = "10")
private Integer avgSpeed;
@ApiModelProperty(value = "行程时间,单位分钟", example = "10")
private Integer travelTime;
}
package net.wanji.opt.controllerv2.report.design;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.ParentResult;
import java.util.ArrayList;
import java.util.List;
@Data
public class GreenReportProblemOverallAnalysis extends ParentResult {
private GreenReportProblemOverallAnalysisResponse content;
public GreenReportProblemOverallAnalysisResponse getContent() {
return content;
}
public GreenReportProblemOverallAnalysis setContent(GreenReportProblemOverallAnalysisResponse content) {
this.content = content;
return this;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
@Data
class GreenReportProblemOverallAnalysisResponse {
@ApiModelProperty(value = "区域干线总拥堵次数", example = "56次")
private String totalCongestCount;
@ApiModelProperty(value = "区域干线总拥堵时长", example = "11小时")
private String totalCongestDuration;
@ApiModelProperty(value = "拥堵严重干线",example = "经十路(舜耕路-山大路)、经十路(洪山路-舜华路)")
private String congestHeavyGreenWave;
private List<GreenReportSamePeriodData> dataList = new ArrayList<>();
}
@Data
class GreenReportProblemOverallData {
@ApiModelProperty(value = "干线ID", example = "")
private String greenId;
@ApiModelProperty(value = "干线名称", example = "")
private String greenName;
List<GreenWaveDirProblemData> list = new ArrayList<>();
}
@Data
class GreenWaveDirProblemData{
@ApiModelProperty(value = "干线类型", example = "主干路")
private String greenWaveType;
@ApiModelProperty(value = "方向", example = "东向西")
private String dir;
@ApiModelProperty(value = "拥堵指数", example = "4.5")
private Double congestIndex;
@ApiModelProperty(value = "拥堵次数", example = "10")
private Integer congestCount;
@ApiModelProperty(value = "拥堵时长,单位秒", example = "10")
private Integer congestDuration;
}
package net.wanji.opt.controllerv2.report.design;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.ParentResult;
import java.util.ArrayList;
import java.util.List;
@Data
public class GreenReportRunStateResult extends ParentResult {
private List<GreenReportRunStateResponse> content;
public List<GreenReportRunStateResponse> getContent() {
return content;
}
public GreenReportRunStateResult setContent(List<GreenReportRunStateResponse> content) {
this.content = content;
return this;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
@Data
class GreenReportRunStateResponse {
@ApiModelProperty(value = "干线ID", example = "")
private String greenId;
@ApiModelProperty(value = "干线名称", example = "")
private String greenName;
@ApiModelProperty(value = "本周早高峰时段集中情况", example = "7:30~8:30")
private String weekAmPeakSpan;
@ApiModelProperty(value = "本周早高峰时段开始时间同比(上周)情况", example = "提前20分钟")
private String amStartSameRatioSituation;
@ApiModelProperty(value = "本周早高峰时段截止时间同比(上周)情况", example = "延后20分钟")
private String amEndSameRatioSituation;
@ApiModelProperty(value = "本周早高峰时段持续时长", example = "45分钟")
private String amDuration;
@ApiModelProperty(value = "本周早高峰时段持续时长同比(上周)情况", example = "增加5分钟")
private String amDurationSameRatioSituation;
@ApiModelProperty(value = "本周早高峰最大行程时间", example = "30分钟")
private String amMaxTravelTime;
@ApiModelProperty(value = "本周早高峰最大行程时间同比(上周)情况", example = "减少6分钟")
private String amMaxTravelTimeSameRatioSituation;
@ApiModelProperty(value = "平均拥堵指数", example = "4.5")
private String amAvgContestIndex;
@ApiModelProperty(value = "平均拥堵指数同比(上周)情况", example = "减少0.5")
private String amAvgContestIndexSameRatioSituation;
@ApiModelProperty(value = "本周早高峰时段集中情况", example = "7:30~8:30")
private String weekPmPeakSpan;
@ApiModelProperty(value = "本周早高峰时段开始时间同比(上周)情况", example = "提前20分钟")
private String pmStartSameRatioSituation;
@ApiModelProperty(value = "本周早高峰时段截止时间同比(上周)情况", example = "延后20分钟")
private String pmEndSameRatioSituation;
@ApiModelProperty(value = "本周早高峰时段持续时长", example = "45分钟")
private String pmDuration;
@ApiModelProperty(value = "本周早高峰时段持续时长同比(上周)情况", example = "增加5分钟")
private String pmDurationSameRatioSituation;
@ApiModelProperty(value = "本周早高峰最大行程时间", example = "30分钟")
private String pmMaxTravelTime;
@ApiModelProperty(value = "本周早高峰最大行程时间同比(上周)情况", example = "减少6分钟")
private String pmMaxTravelTimeSameRatioSituation;
@ApiModelProperty(value = "平均拥堵指数", example = "4.5")
private String pmAvgContestIndex;
@ApiModelProperty(value = "平均拥堵指数同比(上周)情况", example = "减少0.5")
private String pmAvgContestIndexSameRatioSituation;
private List<GreenReportRunStatedData> dataList = new ArrayList<>();
}
@Data
class GreenReportRunStatedData {
@ApiModelProperty(value = "星期", example = "星期一")
private String weekName;
@ApiModelProperty(value = "峰期类型 早高峰、晚高峰、全天", example = "早高峰")
private String peakName;
@ApiModelProperty(value = "本周拥堵时段", example = "7:35~8:40")
private String thisWeekCongestSpan;
@ApiModelProperty(value = "上周拥堵时段", example = "7:50~8:40")
private String lastWeekCongestSpan;
@ApiModelProperty(value = "本周拥堵指数", example = "3.5")
private Double thisWeekCongestIndex;
@ApiModelProperty(value = "上周拥堵指数", example = "3.0")
private Double lastWeekCongestIndex;
@ApiModelProperty(value = "本周平均车速km/h", example = "30.5")
private Double thisWeekAvgSpeed;
@ApiModelProperty(value = "上周平均车速km", example = "30.2")
private Double lastWeekAvgSpeed;
@ApiModelProperty(value = "本周行程时间(分钟)", example = "6.5")
private Double thisWeekTravelTime;
@ApiModelProperty(value = "上周行程时间(分钟)", example = "-1.5%")
private Double lastWeekTravelTime;
}
......@@ -33,7 +33,7 @@ public class GreenReportSamePeriodCompareResult extends ParentResult {
@Data
class GreenReportSamePeriodCompareDataResponse {
@ApiModelProperty(value = "路口ID", example = "")
@ApiModelProperty(value = "干线ID", example = "")
private String greenId;
@ApiModelProperty(value = "干线名称", example = "")
......
package net.wanji.opt.dto;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/10/14 19:06
*/
@Data
public class CrossDirFreeFlowSpeedDTO {
private String crossId;
private Integer dir;
private Double freeFlowSpeed;
}
......@@ -51,4 +51,9 @@ public class SysOptimizeLog implements Serializable {
* 请求时间
*/
private String queryTime;
/**
* 请求信息
*/
private String dataInfo;
}
......@@ -32,15 +32,49 @@ public class SysLogServerImpl extends ServiceImpl<SysLogMapper, SysOptimizeLog>
@Override
public JSONObject findSysOptimizeLog(String crossId,String startTime,String endTime,Integer pageNum,Integer pageSize) {
List<SysOptimizeLog> list = sysLogMapper.findSysOptimizeLog(crossId,startTime,endTime);
List<SysOptimizeLog> results = new ArrayList<>();
for(SysOptimizeLog temp : list){
switch (temp.getCommandType()) {
case "1":
JSONObject temp1 = JSONObject.parseObject(temp.getDataInfo());
if (temp1.get("command").equals(1)) {
temp.setCommandType("步进控制");
} else if (temp1.get("command").equals(0)) {
temp.setCommandType("步进恢复");
}
break;
case "2":
temp.setCommandType("恢复时间表");
break;
case "3":
JSONObject temp2 = JSONObject.parseObject(temp.getDataInfo());
if (temp2.get("command").equals(1)) {
temp.setCommandType("相位锁定");
} else if (temp2.get("command").equals(0)) {
temp.setCommandType("相位解锁");
}
break;
case "4":
temp.setCommandType("临时方案下发");
break;
case "5":
temp.setCommandType("定时任务恢复失败");
break;
default:
temp.setCommandType("其它操作");
break;
}
results.add(temp);
}
List<SysOptimizeLog> collect = new ArrayList<>();
if(CollectionUtils.isNotEmpty(list)){
collect = list.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(results)){
collect = results.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
}
JSONObject result = new JSONObject();
result.put("fullDataList",list);
result.put("fullDataList",results);
result.put("pageList",collect);
result.put("totalPage",Math.ceil((double) list.size() / pageSize));
result.put("totalSize",list.size());
result.put("totalPage",Math.ceil((double) results.size() / pageSize));
result.put("totalSize",results.size());
return result;
}
}
package net.wanji.opt.task;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.databus.dao.entity.GreenCrossDirDTO;
import net.wanji.databus.dao.entity.GreenwaveRealtimePO;
import net.wanji.databus.dao.mapper.GreenwaveRealtimeMapper;
import net.wanji.opt.cache.GreenCrossDirInfoCache;
import net.wanji.opt.common.CommonUtils;
import net.wanji.opt.common.RedisUtils;
import net.wanji.opt.common.enums.GreenBeltDirEnum;
import net.wanji.opt.dto.RingPhaseInfoDTO;
import net.wanji.opt.dto.SchemeGreenDirGreenTimeDTO;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
......@@ -25,20 +32,105 @@ import java.util.stream.Collectors;
*/
@Component
@Slf4j
@Profile("test")
public class HisenseGreenChartTask {
@Resource
private RedisUtils redisUtils;
@Resource
private GreenwaveRealtimeMapper greenwaveRealtimeMapper;
@Scheduled(fixedRate = 10 * 60 * 1000, initialDelay = 1 * 60 * 1000)
//@Scheduled(fixedRate = 1 * 60 * 1000, initialDelay = 30 * 1000)
public void getGreenChart() {
try {
ObjectMapper mapper = JacksonUtils.getInstance();
Map<String, GreenwaveRealtimePO> realTimeMap = getGreenRealTimeMap();
// 绿波路口数据
List<GreenCrossDirDTO> greenCrossDirCache = GreenCrossDirInfoCache.greenCrossDirCache;
if (!CollectionUtils.isEmpty(greenCrossDirCache)) {
List<SchemeGreenDirGreenTimeDTO> schemeGreenDirGreenTimeDTOS = getSchemeGreenDirGreenTimeDTOS(greenCrossDirCache);
if (!CollectionUtils.isEmpty(greenCrossDirCache) && !CollectionUtils.isEmpty(schemeGreenDirGreenTimeDTOS)) {
// 将海信方案环相位转成map形式
HashMap<String, SchemeGreenDirGreenTimeDTO> greenDirGreenTimeMap = new HashMap<>();
for (SchemeGreenDirGreenTimeDTO dto : schemeGreenDirGreenTimeDTOS) {
String crossId = dto.getCrossId();
Integer dir = dto.getDir();
greenDirGreenTimeMap.put(CommonUtils.getStrJoin(crossId, String.valueOf(dir)), dto);
}
// 计算绿灯红灯点位
// 1.现根据绿波长度和速度计算行程时间
// 2.在多个周期中计算相位差绿灯时间
// 3.从相位差绿的时间通过两个路口距离和速度计算两个路口绿灯开始时间
Map<Integer, List<GreenCrossDirDTO>> greenMap = greenCrossDirCache.stream().collect(Collectors.groupingBy(GreenCrossDirDTO::getGreenId));
for (Map.Entry<Integer, List<GreenCrossDirDTO>> entry : greenMap.entrySet()) {
Integer greenId = entry.getKey();
List<GreenCrossDirDTO> value = entry.getValue();
// 1.获取行程时间
GreenCrossDirDTO indexDTO = value.get(0);
Integer indexDir = indexDTO.getInDir();
Integer totalDistance = indexDTO.getTotalDistance();
String greenKey = CommonUtils.getStrJoin(String.valueOf(greenId), String.valueOf(indexDir));
GreenwaveRealtimePO greenwaveRealtimePO = realTimeMap.get(greenKey);
// km/h速度换成m/s
Double speed = greenwaveRealtimePO.getSpeed() / 3.6;
Double travelTime = totalDistance / speed;
for (GreenCrossDirDTO greenCrossDirDTO : value) {
String crossId = greenCrossDirDTO.getCrossId();
String crossKey = CommonUtils.getStrJoin(String.valueOf(crossId), String.valueOf(indexDir));
// 获取海信环相位信息
SchemeGreenDirGreenTimeDTO firstGreenTimeDTO = greenDirGreenTimeMap.get(crossKey);
Integer cycleLen = firstGreenTimeDTO.getCycleLen();
Integer offset = firstGreenTimeDTO.getOffset();
Integer greenEndTime = firstGreenTimeDTO.getEnd();
// 计算出绿灯结束时间到周期结束时间:
Integer redEndTime = cycleLen - greenEndTime;
// 通过行程时间计算周期数量 + 1
double cycleSum = Math.ceil(travelTime / cycleLen) + 1;
for (int i = 0; i < cycleSum; i++) {
Double cycleIndex = i * Double.valueOf(cycleLen);
if (redEndTime > offset) {
}
}
}
}
}
} catch (Exception e) {
log.error("通过海信方案处理绿波波定时任务失败:{}", e);
//throw new RuntimeException(e);
}
}
private Map<String, GreenwaveRealtimePO> getGreenRealTimeMap() {
Map<String, GreenwaveRealtimePO> realTimeMap = new HashMap<>();
LambdaQueryWrapper<GreenwaveRealtimePO> queryWrapper = new LambdaQueryWrapper<>();
List<GreenwaveRealtimePO> greenwaveRealtimePOList = greenwaveRealtimeMapper.selectList(queryWrapper);
for (GreenwaveRealtimePO greenwaveRealtimePO : greenwaveRealtimePOList) {
Integer greenId = greenwaveRealtimePO.getGreenId();
String roadDirection = greenwaveRealtimePO.getRoadDirection();
Integer inDir = GreenBeltDirEnum.getInDir(roadDirection);
realTimeMap.put(String.valueOf(greenId).concat("_").concat(String.valueOf(inDir)), greenwaveRealtimePO);
}
return realTimeMap;
}
/**
* 通过绿波路口获取海信路口协调方向相位绿灯信息
*
* @return
* @throws JsonProcessingException
*/
private List<SchemeGreenDirGreenTimeDTO> getSchemeGreenDirGreenTimeDTOS(List<GreenCrossDirDTO> greenCrossDirCache) throws Exception {
List<SchemeGreenDirGreenTimeDTO> schemeGreenDirGreenTimeDTOS = new ArrayList<>();
ObjectMapper mapper = JacksonUtils.getInstance();
if (!CollectionUtils.isEmpty(greenCrossDirCache)) {
for (GreenCrossDirDTO greenCrossDirDTO : greenCrossDirCache) {
Integer greenId = greenCrossDirDTO.getGreenId();
String greenCrossId = greenCrossDirDTO.getCrossId();
......@@ -49,7 +141,8 @@ public class HisenseGreenChartTask {
if (StringUtils.isBlank(str)) {
continue;
}
List<RingPhaseInfoDTO> ringPhaseInfoDTOS = mapper.readValue(str, new TypeReference<List<RingPhaseInfoDTO>>() {});
List<RingPhaseInfoDTO> ringPhaseInfoDTOS = mapper.readValue(str, new TypeReference<List<RingPhaseInfoDTO>>() {
});
// 遍历绿波路口协调方向
if (StringUtils.isNotBlank(greenDirStr)) {
String[] greenDirArray = greenDirStr.split(",");
......@@ -111,9 +204,7 @@ public class HisenseGreenChartTask {
}
log.error("路口绿灯协调方向时间:{}", mapper.writeValueAsString(schemeGreenDirGreenTimeDTOS));
}
} catch (Exception e) {
log.error("通过海信方案处理绿波波定时任务失败:{}", e);
//throw new RuntimeException(e);
}
return schemeGreenDirGreenTimeDTOS;
}
}
......@@ -31,6 +31,7 @@ import net.wanji.opt.synthesis.pojo.StrategyControlDetailList;
import net.wanji.opt.synthesis.pojo.StrategyDailyPlanInfoEntity;
import net.wanji.opt.synthesis.pojo.StrategyPlanInfoEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
......@@ -56,6 +57,7 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
@Component
@Slf4j
@Profile("docker")
public class InducesMonitorTask {
@Autowired
......
......@@ -270,7 +270,12 @@
<!-- 统一接口:绿波路口车道级指标趋势,支持按5分钟粒度、15分钟粒度、30分钟粒度、1小时粒度汇聚 -->
<select id="findCrossObjectIndex"
resultType="net.wanji.opt.po.base.CrossLaneDataHistPoExtend">
SELECT MIN(ifnull(t.unit_time,#{startDate})) start_time,
SELECT (case
when #{groupType}=4 then date_format(dt,'%Y-%m-%d 00:00:00')
else
MIN(ifnull(t.unit_time,#{startDate}))
end
) start_time,
cross_id ,
lane_no ,
dir_type ,
......@@ -289,12 +294,12 @@
group_concat(service_level) service_level
FROM
(
SELECT start_time,
SELECT start_time,dt,
(case
when #{groupType}=0 then DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 5 ) * 5 ),'%Y-%m-%d %H:%i:00' )
when #{groupType}=1 then DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 15 ) * 15 ),'%Y-%m-%d %H:%i:00' )
when #{groupType}=2 then DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 30 ) * 30 ),'%Y-%m-%d %H:%i:00' )
when #{groupType}=3 then DATE_FORMAT(start_time,'%Y-%m-%d %H:00:00' )
when #{groupType}=0 then start_time
when #{groupType}=1 then dt_15min
when #{groupType}=2 then dt_30min
when #{groupType}=3 then dt
when #{groupType}=4 then DATE_FORMAT(start_time,'%Y-%m-%d 00:00:00' )
else DATE_FORMAT(start_time,'%Y-01-01 00:00:00') <!-- 按查询时间范围不分粒度进行聚合处理 -->
end
......@@ -405,15 +410,15 @@
<choose>
<!-- 方向级 -->
<when test="objectType==1">
GROUP BY t.cross_id,t.dir_type,unit_time
GROUP BY t.cross_id,unit_time,t.dir_type
</when>
<!-- 转向级 -->
<when test="objectType==2">
GROUP BY t.cross_id,t.dir_type,t.turn_type,unit_time
GROUP BY t.cross_id,unit_time,t.dir_type,t.turn_type
</when>
<!-- 车道级 -->
<when test="objectType==3">
GROUP BY t.cross_id,t.lane_no,t.dir_type,t.turn_type,unit_time
GROUP BY t.cross_id,unit_time,t.lane_no,t.dir_type,t.turn_type
</when>
<!-- 路口级 -->
<when test="objectType==4">
......@@ -787,12 +792,7 @@
<select id="findCrossObjectIndexByDay"
resultType="net.wanji.opt.po.base.CrossLaneDataHistPoExtend">
SELECT
(case
when #{groupType}=4 then date_format(dt,'%Y-%m-%d 00:00:00')
else
MIN(ifnull(t.unit_time,#{startDate}))
end
) start_time,
MIN(ifnull(t.unit_time,#{startDate})) start_time,
cross_id ,
lane_no ,
dir_type ,
......@@ -813,11 +813,10 @@
(
SELECT start_time,
(case
when #{groupType}=0 then start_time
when #{groupType}=1 then dt_15min
when #{groupType}=2 then dt_30min
when #{groupType}=3 then dt_60min
when #{groupType}=4 then dt
when #{groupType}=0 then DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 5 ) * 5 ),'%Y-%m-%d %H:%i:00' )
when #{groupType}=1 then DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 15 ) * 15 ),'%Y-%m-%d %H:%i:00' )
when #{groupType}=2 then DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 30 ) * 30 ),'%Y-%m-%d %H:%i:00' )
when #{groupType}=3 then DATE_FORMAT(start_time,'%Y-%m-%d %H:00:00' )
else DATE_FORMAT(now(),'%Y-01-01 00:00:00') <!-- 按查询时间范围不分粒度进行聚合处理 -->
end
) unit_time,
......
......@@ -10,11 +10,12 @@
<result property="commandType" column="command_type"></result>
<result property="commandResult" column="command_result"></result>
<result property="queryTime" column="query_time"></result>
<result property="dataInfo" column="data_info"></result>
</resultMap>
<select id="findSysOptimizeLog" resultMap="SysOptimizeLogMap" parameterType="String">
SELECT t.query_time,t.ip ,t.cross_id,t1.name ,t.`operate-user`,
case t.command_type when 1 then '步进控制/恢复(公用)' when 2 then '恢复时间表(公用)' when 3 then '相位锁定/解锁(公用)' when 4 then '临时方案下发(公用)' when 5 then '定时任务恢复失败' end as command_type ,
SELECT t.query_time,t.ip ,t.cross_id,t1.name ,t.`operate-user`,t.data_info,
t.command_type ,
case t.command_result when 1 then '成功' when 2 then '失败' when 3 then '停止失败任务解锁' end as command_result
FROM t_signal_utc_jinan.t_signal_command_log t
left join t_signal_utc_jinan.t_cross_info t1 on t.cross_id = t1.id
......
......@@ -11,4 +11,9 @@ public class GreenCrossDirDTO {
private Integer greenId;
private String crossId;
private String greenDir;
private Integer inDir;
private Integer outDir;
private Integer sort;
private Integer distance;
private Integer totalDistance;
}
......@@ -68,7 +68,10 @@
</select>
<select id="selectAllGreenCrossDir" resultType="net.wanji.databus.dao.entity.GreenCrossDirDTO">
select t2.green_id, t2.cross_id, t1.green_dir from t_greenwave_info t1
select
t2.green_id, t2.cross_id, t1.green_dir, t2.in_dir, t2.out_dir, t2.sort,
t2.next_cross_len distance, t1.length total_distance
from t_greenwave_info t1
left join t_greenwave_cross t2 on t1.id = t2.green_id
</select>
......
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