Commit d0bc74ef authored by 黄伟铭's avatar 黄伟铭

Merge remote-tracking branch 'origin/master'

parents 4d4bb296 9738cae8
package net.wanji.opt.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RestTemplateConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Value("${spring.redis.database}")
private int redisDatabase;
@Value("${spring.redis.password}")
private String redisPassword;
// 默认使用配置的数据库
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory factory = new LettuceConnectionFactory(redisHost, redisPort);
factory.setPassword(redisPassword);
factory.setDatabase(redisDatabase);
return factory;
}
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
return template;
}
// 使用7号数据库
@Bean(name = "redis7ConnectionFactory")
public RedisConnectionFactory redis7ConnectionFactory() {
LettuceConnectionFactory factory = new LettuceConnectionFactory(redisHost, redisPort);
factory.setPassword(redisPassword);
factory.setDatabase(7);
return factory;
}
@Bean(name = "redis7Template")
public RedisTemplate<String, Object> redis7Template() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redis7ConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
\ No newline at end of file
//package net.wanji.opt.config;
//
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.serializer.StringRedisSerializer;
//
//@Configuration
//public class RestTemplateConfig {
//
// @Value("${spring.redis.host}")
// private String redisHost;
//
// @Value("${spring.redis.port}")
// private int redisPort;
//
// @Value("${spring.redis.database}")
// private int redisDatabase;
//
// @Value("${spring.redis.password}")
// private String redisPassword;
//
//
// // 默认使用配置的数据库
// @Bean
// public RedisConnectionFactory redisConnectionFactory() {
// LettuceConnectionFactory factory = new LettuceConnectionFactory(redisHost, redisPort);
// factory.setPassword(redisPassword);
// factory.setDatabase(redisDatabase);
// return factory;
// }
//
// @Bean(name = "redisTemplate")
// public RedisTemplate<String, Object> redisTemplate() {
// RedisTemplate<String, Object> template = new RedisTemplate<>();
// template.setConnectionFactory(redisConnectionFactory());
// template.setKeySerializer(new StringRedisSerializer());
// template.setValueSerializer(new StringRedisSerializer());
// return template;
// }
//
// // 使用7号数据库
// @Bean(name = "redis7ConnectionFactory")
// public RedisConnectionFactory redis7ConnectionFactory() {
// LettuceConnectionFactory factory = new LettuceConnectionFactory(redisHost, redisPort);
// factory.setPassword(redisPassword);
// factory.setDatabase(7);
// return factory;
// }
//
// @Bean(name = "redis7Template")
// public RedisTemplate<String, Object> redis7Template() {
// RedisTemplate<String, Object> template = new RedisTemplate<>();
// template.setConnectionFactory(redis7ConnectionFactory());
// template.setKeySerializer(new StringRedisSerializer());
// template.setValueSerializer(new StringRedisSerializer());
// return template;
// }
//
//}
\ No newline at end of file
......@@ -3,12 +3,12 @@ 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.po.base.CrossLaneDataHistPoExtend;
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.CrossRealTimeAlarmVO;
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;
......@@ -37,22 +37,46 @@ 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 = "方向", required = false, dataType = "String",defaultValue = "北进口"),
@ApiImplicitParam(name = "directionName", value = "方向 支持 北进口;东进口;南进口;西进口", dataType = "String", defaultValue = "北进口;东进口;南进口;西进口"),
})
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = CrossStatusDistributionVO.class),
})
public JsonViewObject getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, @RequestParam(defaultValue = "") String directionName) {
public JsonViewObject getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String directionName) {
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("路口状态分布查询失败");
Map<String, Object> map = new HashMap<>();
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("路口状态分布查询失败");
}
}
return jsonViewObject.success(result);
map.put("optTimeList", crossService.getOptTimeList(crossID));
return jsonViewObject.success(map);
}
@ApiOperation(value = "路口实时告警", notes = "路口实时告警", response = JsonViewObject.class, httpMethod="GET")
......
......@@ -152,7 +152,7 @@ public class TrendControllerV2 {
if (StringUtils.isBlank(type)) {
list = trendServiceV2.eventAlarmRealTimeList();
} else {
list = trendServiceV2.eventAlarmRealTimeList().stream()
list = trendServiceV2.eventAlarmRealTimeList().stream()
.filter(vo -> StringUtils.equalsIgnoreCase(type, vo.getType()))
.collect(Collectors.toList());
}
......@@ -160,7 +160,8 @@ public class TrendControllerV2 {
log.error("态势监测-事件告警-实时列表:", e);
JsonViewObject.newInstance().success(list);
}
return JsonViewObject.newInstance().success(list);
List<OptMonitoringVO> collect = list.stream().filter(vo -> !StringUtils.equalsIgnoreCase("700", vo.getType())).collect(Collectors.toList());
return JsonViewObject.newInstance().success(collect);
}
@ApiOperation(value = "态势监测-区域体检-雷达图绿波类型过滤", notes = "态势监测-区域体检-雷达图绿波类型过滤",
......@@ -231,9 +232,27 @@ public class TrendControllerV2 {
try {
result = trendServiceV2.optStrategyResultInfo(id);
} catch (Exception e) {
log.error("态势监测-事件告警-历史列表:", e);
log.error("态势监测-策略推荐-优化策略:", e);
JsonViewObject.newInstance().success(result);
}
return JsonViewObject.newInstance().success(result);
}
@ApiOperation(value = "态势监测-策略推荐-绿波优化相位差", notes = "态势监测-策略推荐-绿波优化相位差",
response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@GetMapping(value = "/optStrategyCrossOffsetList")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = OptMonitoringVO.class),
})
public JsonViewObject optStrategyCrossOffsetList(Integer id) throws Exception {
GreenOptCrossOffsetVO greenOptCrossOffsetVO = new GreenOptCrossOffsetVO();
try {
greenOptCrossOffsetVO = trendServiceV2.optStrategyCrossOffsetList(id);
} catch (Exception e) {
log.error("态势监测-策略推荐-绿波优化相位差:", e);
JsonViewObject.newInstance().success(greenOptCrossOffsetVO);
}
return JsonViewObject.newInstance().success(greenOptCrossOffsetVO);
}
}
\ No newline at end of file
......@@ -44,8 +44,6 @@ public class TrunkLineController {
responseHeaders = {@ResponseHeader(name = "Content-Type", description = "application/json")})
})
public JsonViewObject statusDisInfoList(String greenID, String date, String timeGranule) {
try {
JsonViewObject object = JsonViewObject.newInstance();
JSONObject list = trunkLineStatusDisService.trunkLineStatusDisInfoList(greenID, date, timeGranule);
......@@ -97,4 +95,24 @@ public class TrunkLineController {
return JsonViewObject.newInstance().fail("获取干线实时告警失败");
}
}
@ApiOperation(value = "干线路口问题", notes = "干线路口问题", response = JsonViewObject.class, httpMethod="GET")
@ApiImplicitParams({
@ApiImplicitParam(name = "greenID", value = "绿波ID", required = true, dataType = "Integer", paramType = "query"),
@ApiImplicitParam(name = "time", value = "时间 格式:yyyy-MM-dd HH:ii:ss", dataType = "String", paramType = "query"),
})
@GetMapping(value = "/getTrunkLineCrossProblem")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = TrunkLineCrossProblemVO.class),
})
public JsonViewObject getTrunkLineCrossProblem(Integer greenID, @RequestParam(defaultValue = "") String time) {
try {
JsonViewObject object = JsonViewObject.newInstance();
List<TrunkLineCrossProblemVO> list = trunkLineService.getTrunkLineCrossProblem(greenID,time);
return object.success(list);
} catch (Exception e) {
log.error("获取干线路口问题失败: ", e);
return JsonViewObject.newInstance().fail("获取干线路口问题失败");
}
}
}
......@@ -65,8 +65,9 @@ public class AnalysisProblemAreaDayController {
@ApiOperation(value = "区域-路口问题数量分析", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiImplicitParams({
@ApiImplicitParam(name = "eventType", value = "事件代码 701:路口空放 702:路口失衡,703:路口溢出 705:干线缓行 706:干线拥堵 707:路口拥堵", required = true, dataType = "String", defaultValue = ""),
@ApiImplicitParam(name = "eventType", value = "事件代码 701:路口空放 702:路口失衡,703:路口溢出 707:路口拥堵", required = true, dataType = "String", defaultValue = ""),
@ApiImplicitParam(name = "areaId", value = "区域ID", required = true, dataType = "String", defaultValue = "1"),
@ApiImplicitParam(name = "timeType", value = "事件类型 1:近一个月 2:近一周", required = true, dataType = "int", defaultValue = "1"),
})
@GetMapping(value = "/cross-problem-number")
......@@ -81,7 +82,7 @@ public class AnalysisProblemAreaDayController {
@ApiOperation(value = "区域-干线问题数量分析", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiImplicitParams({
@ApiImplicitParam(name = "eventType", value = "事件代码 701:路口空放 702:路口失衡,703:路口溢出 705:干线缓行 706:干线拥堵 707:路口拥堵 ", required = true, dataType = "String", defaultValue = ""),
@ApiImplicitParam(name = "eventType", value = "事件代码 705:干线缓行 706:干线拥堵 ", required = true, dataType = "String", defaultValue = ""),
@ApiImplicitParam(name = "areaId", value = "区域ID", required = true, dataType = "String", defaultValue = "1"),
@ApiImplicitParam(name = "timeType", value = "事件类型 1:近一个月 2:近一周", required = true, dataType = "int", defaultValue = "1"),
})
......
......@@ -9,6 +9,7 @@ import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.areaproblem.AreaProblemOverview;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.areaproblem.AreaProblemTrendAnalysisResult;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.crossproblem.CrossDirProblemTrendAnalysisResult;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.crossproblem.CrossProblemDirTrendAnalysisResult;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.crossproblem.CrossProblemTimeDirReasonResult;
import net.wanji.opt.servicev2.judgeanalysis.AnalysisProblemCrossDayService;
......@@ -93,7 +94,7 @@ public class AnalysisProblemCrossDayController {
})
@GetMapping(value = "/dir-trend")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = AreaProblemTrendAnalysisResult.class),
@ApiResponse(code = 200, message = "OK", response = CrossDirProblemTrendAnalysisResult.class),
})
public JsonViewObject dirTrend(String crossId,String timeType,String eventType) {
return JsonViewObject.newInstance().success(null);
......
package net.wanji.opt.controllerv2.judgeanalysis;
import net.wanji.opt.entity.judgeanalysis.AnalysisProblemGreenDay;
import net.wanji.opt.servicev2.judgeanalysis.AnalysisProblemGreenDayService;
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 net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.areaproblem.AreaProblemOverview;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.areaproblem.AreaProblemTrendAnalysisResult;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.crossproblem.CrossProblemDirTrendAnalysisResult;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.greenproblem.GreenCrossProblemTrendAnalysisResult;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.greenproblem.GreenProblemTimeDirReasonResult;
import net.wanji.opt.servicev2.judgeanalysis.AnalysisProblemGreenDayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import net.wanji.opt.api.ResultGenerator;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.util.List;
import javax.ws.rs.core.MediaType;
/**
* <p>
......@@ -35,44 +39,65 @@ public class AnalysisProblemGreenDayController {
@ApiOperation(value = "绿波问题分析详情", response = AnalysisProblemGreenDay.class)
@GetMapping(value = "/info/{id}")
public Object info(@PathVariable Long id) {
Object data = analysisProblemGreenDayService.info(id);
return ResultGenerator.genSuccessResult(data);
@ApiOperation(value = "绿波干线-问题数量总览", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiImplicitParams({
@ApiImplicitParam(name = "greenId", value = "绿波干线", required = true, dataType = "String", defaultValue = ""),
@ApiImplicitParam(name = "timeType", value = "事件类型 1:近一个月 2:近一周", required = true, dataType = "int", defaultValue = "1"),
})
@GetMapping(value = "/overview")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = AreaProblemOverview.class),
})
public JsonViewObject problemOverview(String greenId,Integer timeType) {
return JsonViewObject.newInstance().success(null);
}
@ApiOperation(value = "绿波问题分析新增")
@PostMapping(value = "/add")
public Object add(@Valid @RequestBody AnalysisProblemGreenDay param) {
analysisProblemGreenDayService.add(param);
return ResultGenerator.genSuccessResult();
@ApiOperation(value = "绿波干线-报警走势", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiImplicitParams({
@ApiImplicitParam(name = "greenId", value = "绿波干线", required = true, dataType = "String", defaultValue = ""),
@ApiImplicitParam(name = "timeType", value = "事件类型 1:近一个月 2:近一周", required = true, dataType = "int", defaultValue = "1"),
})
@GetMapping(value = "/trend")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = AreaProblemTrendAnalysisResult.class),
})
public JsonViewObject trend(String greenId,Integer timeType) {
return JsonViewObject.newInstance().success(null);
}
@ApiOperation(value = "绿波问题分析修改")
@PostMapping(value = "/modify")
public Object modify(@Valid @RequestBody AnalysisProblemGreenDay param) {
analysisProblemGreenDayService.modify(param);
return ResultGenerator.genSuccessResult();
}
@ApiOperation(value = "绿波问题分析删除(单个条目)")
@GetMapping(value = "/remove/{id}")
public Object remove(@PathVariable Long id) {
analysisProblemGreenDayService.remove(id);
return ResultGenerator.genSuccessResult();
@ApiOperation(value = "绿波干线-问题发生时段、方向、原因分析", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiImplicitParams({
@ApiImplicitParam(name = "greenId", value = "绿波干线", required = true, dataType = "String", defaultValue = ""),
@ApiImplicitParam(name = "timeType", value = "事件类型 1:近一个月 2:近一周", required = true, dataType = "int", defaultValue = "1"),
})
@GetMapping(value = "/detail")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenProblemTimeDirReasonResult.class),
})
public JsonViewObject detail(String greenId,String timeType) {
return JsonViewObject.newInstance().success(null);
}
@ApiOperation(value = "绿波问题分析删除(多个条目)")
@PostMapping(value = "/removes")
public Object removes(@Valid @RequestBody List<Long> ids) {
analysisProblemGreenDayService.removes(ids);
return ResultGenerator.genSuccessResult();
@ApiOperation(value = "绿波干线-干线路口问题情况分布",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiImplicitParams({
@ApiImplicitParam(name = "greenId", value = "绿波干线", required = true, dataType = "String", defaultValue = ""),
@ApiImplicitParam(name = "timeType", value = "事件类型 1:近一个月 2:近一周", required = true, dataType = "int", defaultValue = "1"),
@ApiImplicitParam(name = "eventType", value = "事件代码 701:空放 702:路口失衡,703:路口溢出 707:路口拥堵", required = true, dataType = "String", defaultValue = "")
})
@GetMapping(value = "/cross-trend")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenCrossProblemTrendAnalysisResult.class),
})
public JsonViewObject dirTrend(String greenId,String timeType,String eventType) {
return JsonViewObject.newInstance().success(null);
}
}
\ No newline at end of file
package net.wanji.opt.controllerv2.judgeanalysis;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.exception.DubboProviderException;
import net.wanji.common.framework.i18n.I18nResourceBundle;
import net.wanji.common.framework.rest.AbstractRestServer;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.framework.rest.Page;
import net.wanji.common.framework.rest.impl.AbstractRestServerImpl;
import net.wanji.databus.po.BaseAreaInfoPO;
import net.wanji.opt.entity.BaseAreaInfo;
import net.wanji.opt.servicev2.judgeanalysis.BaseAreaInfoService;
import net.wanji.opt.vo.GreenWaveRunStateVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.ws.rs.core.MediaType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 区域基础信息 接口API
* </p>
* @version 1.0
* @author wangtao
* @Date 2025-03-18
*/
@RestController
@Slf4j
@RequestMapping("/base-area-info")
@Api(value="BaseAreaInfoController", description="区域基础信息接口", tags = "区域基础信息")
public class BaseAreaInfoController {
@Autowired
private BaseAreaInfoService baseAreaInfoService;
@ApiOperation(httpMethod="GET",value="区域基础信息-根据区划类型查询对应集合数据", notes="")
@GetMapping(value = "/byCondition")
public JsonViewObject getListByType(@RequestParam(value = "type", required = false, defaultValue = "2") Integer type) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try {
List<BaseAreaInfoPO> list = baseAreaInfoService.selectByType(type);
jsonViewObject.success(list);
} catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
}
return jsonViewObject;
}
}
......@@ -43,7 +43,7 @@ class CrossProblemAnalysisResultResponse {
@ApiModelProperty(value = "事件类型名称",example = "路口拥堵")
private String eventLabel ;
@ApiModelProperty(value = "事件问题梳理",example = "2",dataType = "Integer")
@ApiModelProperty(value = "事件问题数量",example = "2",dataType = "Integer")
private Integer number ;
}
......
......@@ -35,9 +35,9 @@ class GreenProblemAnalysisResultResponse {
private Integer greenId ;
@ApiModelProperty(value = "绿波干线名称",example = "经十路(舜耕路-山大路)")
private String crossName ;
private String greenName ;
@ApiModelProperty(value = "事件代码 701:空放 702:路口失衡,703:路口溢出 707:路口拥堵",example = "'707'" , dataType = "String")
@ApiModelProperty(value = "事件代码 705:干线缓行 706:干线拥堵",example = "'707'" , dataType = "String")
private String eventType ;
@ApiModelProperty(value = "事件类型名称",example = "路口拥堵")
......
......@@ -31,7 +31,7 @@ public class AreaProblemOverview extends ParentResult {
@Data
class EventAnalysisResultResponse {
@ApiModelProperty(value = "事件代码 701:空放 702:路口失衡,703:路口溢出 707:路口拥堵",example = "'707'",dataType = "string")
@ApiModelProperty(value = "事件代码 701:空放 702:路口失衡,703:路口溢出 705:干线缓行 706:干线拥堵 707:路口拥堵",example = "'707'",dataType = "string")
private String eventType ;
@ApiModelProperty(value = "事件类型名称",example = "路口拥堵")
......
......@@ -43,17 +43,5 @@ class ProblemTrendAnalysisResultResponse {
}
@Data
class ProblemTrendAnalysisResultTimeFlow {
@ApiModelProperty(value = "事件代码 701:空放 702:路口失衡,703:路口溢出 707:路口拥堵",example = "'707'",dataType = "string")
private String eventType ;
@ApiModelProperty(value = "事件类型名称",example = "路口拥堵")
private String eventLabel ;
@ApiModelProperty(value = "时段事件数量,时段对应到timeList",example = "[300,400]",dataType = "int[]")
private List<Integer> list ;
}
package net.wanji.opt.controllerv2.judgeanalysis.design.response.areaproblem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author fengyi
* @date 2025/3/17
* @description
*/
@Data
public class ProblemTrendAnalysisResultTimeFlow {
@ApiModelProperty(value = "事件代码 701:空放 702:路口失衡,703:路口溢出 705:干线缓行 706:干线拥堵 707:路口拥堵",example = "'707'",dataType = "string")
private String eventType ;
@ApiModelProperty(value = "事件类型名称",example = "路口拥堵")
private String eventLabel ;
@ApiModelProperty(value = "时段事件数量,时段对应到timeList",example = "[300,400]",dataType = "int[]")
private List<Integer> list ;
}
package net.wanji.opt.controllerv2.judgeanalysis.design.response.crossproblem;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.ParentResult;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.areaproblem.AreaProblemTrendAnalysisResult;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.areaproblem.ProblemTrendAnalysisResultTimeFlow;
import java.util.ArrayList;
import java.util.List;
@Data
public class CrossDirProblemTrendAnalysisResult extends ParentResult {
private CrossDirProblemTrendAnalysisResultResponse content;
public CrossDirProblemTrendAnalysisResultResponse getContent() {
return content;
}
public CrossDirProblemTrendAnalysisResult setContent(CrossDirProblemTrendAnalysisResultResponse content) {
this.content = content;
return this;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
@Data
class CrossDirProblemTrendAnalysisResultResponse {
@ApiModelProperty(value = "时段列表",example = "[\"20250311\",\"20250312\"]",dataType = "String[]")
private List<String> timeList = new ArrayList<>();
// @ApiModelProperty(value = "各路口时段流量列表",
// example = "[{\"name\":\"路口1\",\"list\":[150,300]}," +
// "{\"name\":\"路口2\",\"list\":[150,300]}]")
private List<CrossDirProblemTrendAnalysisResultTimeFlow> dataList=new ArrayList<>();
}
@Data
class CrossDirProblemTrendAnalysisResultTimeFlow extends ProblemTrendAnalysisResultTimeFlow {
@ApiModelProperty(value = "方向编码",example = "")
private Integer dir ;
@ApiModelProperty(value = "方向名称",example = "")
private String dirName ;
}
package net.wanji.opt.controllerv2.judgeanalysis.design.response.greenproblem;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.ParentResult;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.areaproblem.ProblemTrendAnalysisResultTimeFlow;
import net.wanji.opt.controllerv2.judgeanalysis.design.response.crossproblem.CrossDirProblemTrendAnalysisResult;
import java.util.ArrayList;
import java.util.List;
@Data
public class GreenCrossProblemTrendAnalysisResult extends ParentResult {
private GreenProblemTrendAnalysisResultResponse content;
public GreenProblemTrendAnalysisResultResponse getContent() {
return content;
}
public GreenCrossProblemTrendAnalysisResult setContent(GreenProblemTrendAnalysisResultResponse content) {
this.content = content;
return this;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
@Data
class GreenProblemTrendAnalysisResultResponse {
@ApiModelProperty(value = "时段列表",example = "[\"20250311\",\"20250312\"]",dataType = "String[]")
private List<String> timeList = new ArrayList<>();
// @ApiModelProperty(value = "各路口时段流量列表",
// example = "[{\"name\":\"路口1\",\"list\":[150,300]}," +
// "{\"name\":\"路口2\",\"list\":[150,300]}]")
private List<GreenProblemTrendAnalysisResultTimeFlow> dataList=new ArrayList<>();
}
@Data
class GreenProblemTrendAnalysisResultTimeFlow extends ProblemTrendAnalysisResultTimeFlow {
@ApiModelProperty(value = "路口ID",example = "",dataType = "string")
private String crossId ;
@ApiModelProperty(value = "路口名称",example = "")
private String crossName ;
}
package net.wanji.opt.controllerv2.judgeanalysis.design.response.greenproblem;
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.List;
@Data
public class GreenProblemTimeDirReasonResult extends ParentResult {
private GreenProblemTimeDirReasonBody content;
public GreenProblemTimeDirReasonBody getContent() {
return content;
}
public GreenProblemTimeDirReasonResult setContent(GreenProblemTimeDirReasonBody content) {
this.content = content;
return this;
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}
@Data
class GreenProblemTimeDirReasonBody {
@ApiModelProperty(value = "事件类型码",example = "'706'" )
private String eventType ;
@ApiModelProperty(value = "事件类型名称",example = "干线拥堵")
private String eventLabel ;
@ApiModelProperty(value = "问题主要发生时段",example = "[\"07:00-08:00\",\"18:00-19:00\"]")
private List<String> timeList ;
@ApiModelProperty(value = "主要【拥堵/缓行】路口" ,example = "[\"路口1\",\"路口2\"]")
private List<String> mainCongestCrossName ;
@ApiModelProperty(value = "主要【拥堵/缓行】路段",example = "[\"路段1\",\"路段2\"]")
private List<String> mainCongestRoadName ;
// TODO 需要有个计算任务,根据小时流量或其他指标计算事件发生的原因
@ApiModelProperty(value = "问题发生原因",example = "[\"区位原因\",\"交通流原因\"]")
private List<String> reasonList ;
}
package net.wanji.opt.dao.mapper;
import io.lettuce.core.dynamic.annotation.Param;
import net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity;
import net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity;
import net.wanji.opt.vo2.CrossRealTimeAlarmVO;
......@@ -25,4 +26,16 @@ public interface TrunkLineMapper{
* @return
*/
List<CrossRealTimeAlarmVO> getTrunkLineRealTimeAlarm(@Param("greenID") Integer greenID,@Param("time") String time);
/**
* 获取干线路口事件描述
* @return
*/
List<TrunkLineCrossProblemEntity> getTrunkLineCrossProblem(@Param("greenID") Integer greenID, @Param("time") String time);
/**
* 获取进出口方向
*/
TrunkLineCrossProblemEntity getIODir(@Param("greenID") Integer greenID);
}
package net.wanji.opt.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import net.wanji.common.framework.domain.TrackableEntity;
import java.util.Date;
import java.math.BigDecimal;
/**
* <p>
* 区域基础信息
* </p>
*
* @Author wangtao
* @Date 2025-03-18
*/
@Data
@ApiModel(value="BaseAreaInfo对象", description="区域基础信息")
public class BaseAreaInfo extends TrackableEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "行政区划代码")
private Long code;
@ApiModelProperty(value = "行政区划名称")
private String name;
@ApiModelProperty(value = "道路名称")
private String roadName;
@ApiModelProperty(value = "区划类型:1行政区划;2交警辖区;3商圈;4交通小区;5热点区域;6道路")
private Integer type;
@ApiModelProperty(value = "父节点")
private Integer parentCode;
@ApiModelProperty(value = "区域中心点")
private String location;
@ApiModelProperty(value = "区域边界")
private String polylines;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "创建时间")
private Date gmtCreate;
@ApiModelProperty(value = "修改时间")
private Date gmtModified;
}
package net.wanji.opt.servicev2;
import net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity;
import net.wanji.opt.synthesis.pojo.CrossStatusDisOptTimeEntity;
import net.wanji.opt.vo2.CrossStatusDistributionVO;
import java.util.List;
......@@ -23,14 +24,20 @@ public interface CrossService {
* @param directionName 方向
* @return 包含状态分布信息列表与优化时间列表
*/
Map<String, List<?>> getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String directionName);
List<CrossStatusDistributionVO> getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String directionName);
/**
* 获取路口实时告警
* @param crossID
* @param crossID 路口ID
* @param time 可选参数
* @return
*/
List<CrossRealTimeAlarmEntity> getCrossRealTimeAlarm(String crossID, String time);
/**
* 获取路口优化时间
* @param crossID 路口ID
* @return
*/
List<CrossStatusDisOptTimeEntity> getOptTimeList(String crossID);
}
......@@ -31,4 +31,6 @@ public interface TrendServiceV2 {
String optStrategyResultInfo(String id) throws Exception;
GreenOptCrossOffsetVO optStrategyCrossOffsetList(Integer id) throws Exception;
}
\ No newline at end of file
......@@ -2,7 +2,7 @@ package net.wanji.opt.servicev2;
import net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity;
import net.wanji.opt.vo2.CrossRealTimeAlarmVO;
import net.wanji.opt.vo2.TrunkLineProblemDescribeVO;
import net.wanji.opt.vo2.TrunkLineCrossProblemVO;
import java.util.List;
......@@ -22,4 +22,9 @@ public interface TrunkLineService {
* 获取干线实时告警
*/
List<CrossRealTimeAlarmVO> getTrunkLineRealTimeAlarm(Integer greenID, String time);
/**
* 干线路口事件描述列表
*/
List<TrunkLineCrossProblemVO> getTrunkLineCrossProblem(Integer greenID, String time);
}
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;
......@@ -11,18 +9,19 @@ import net.wanji.opt.po.base.CrossLaneDataHistPoExtend;
import net.wanji.opt.servicev2.CrossService;
import net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity;
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.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 监测详情-路口事件详情
* 监测详情-路口事件详情
*
* @author zhengyifan
* @date 2025/3/15
*/
......@@ -36,18 +35,19 @@ public class CrossServiceImpl implements CrossService {
/**
* 路口状态分布
* @param crossID 路口ID
* @param date 日期
* @param groupType 时间粒度 参数要求:0--5分钟 1--15分钟 2--30分钟 3--60分钟
* @param objectType 范围 参数要求:1--方向级 2--转向级 3--车道级 4--路口级
* @param directionName 方向
*
* @param crossID 路口ID
* @param date 日期
* @param groupType 时间粒度 参数要求:0--5分钟 1--15分钟 2--30分钟 3--60分钟
* @param objectType 范围 参数要求:1--方向级 2--转向级 3--车道级 4--路口级
* @param directionName 方向 东南西北
* @return
*/
@Override
public Map<String, List<?>> getCrossStatusDistribution(String crossID, String date, String groupType, Integer objectType, String directionName) {
public List<CrossStatusDistributionVO> 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("startDate", date + " 00:00:00");
params.put("endDate", date + " 23:59:59");
params.put("groupType", groupType);
params.put("objectType", objectType);
......@@ -56,35 +56,43 @@ public class CrossServiceImpl implements CrossService {
}
List<CrossLaneDataHistPoExtend> firstList = greenwaveHistoryMapper.findCrossObjectIndex(params);
List<CrossStatusDisOptTimeEntity> optTimeList = crossMapper.getOptTimes(crossID);
List<CrossStatusDistributionVO> infoList = new ArrayList<>();
List<CrossStatusDistributionVO> results = 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());
for (CrossLaneDataHistPoExtend c: firstList) {
CrossStatusDistributionVO cd = new CrossStatusDistributionVO();
info.setStartTime(c.getStartTime().toString().substring(11,16));
infoList.add(info);
}
cd.setSpeed(c.getSpeed());
cd.setStartTime(c.getStartTime().toString().substring(11, 16));
cd.setDelayTime(c.getDelayTime());
cd.setTurnType(c.getTurnType());
cd.setTurnTypeName(BaseEnum.TurnTypeEnum.getNameByCode(c.getTurnType()));
cd.setDirType(c.getDirType());
cd.setDirTypeName(BaseEnum.SignalDirectionEnum.getNameByCode(c.getDirType()));
cd.setStopTimes(c.getStopTimes());
cd.setQueueLength(c.getAvgQueueLength());
cd.setLaneNo(c.getLaneNo());
Map<String, List<?>> result = new HashMap<>();
result.put("infoList", infoList);
result.put("optTimeList", optTimeList);
results.add(cd);
}
return result;
return results;
}
/**
* 路口实时告警
* @param crossID
* @param time 可选参数
*
* @param crossID 路口ID
* @param time 可选参数
* @return
*/
@Override
public List<CrossRealTimeAlarmEntity> getCrossRealTimeAlarm(String crossID, String time) {
return crossMapper.getCrossRealTimeAlarms(crossID, time);
}
@Override
public List<CrossStatusDisOptTimeEntity> getOptTimeList(String crossID) {
return crossMapper.getOptTimes(crossID);
}
}
package net.wanji.opt.servicev2.implv2;
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 com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.utils.tool.DateUtil;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.databus.dao.entity.BaseCrossSchemePO;
import net.wanji.databus.dao.entity.GreenwaveCrossPO;
import net.wanji.databus.dao.entity.GreenwaveHistPO;
import net.wanji.databus.dao.mapper.BaseCrossSchemeMapper;
import net.wanji.databus.dao.mapper.CrossDataHistMapper;
import net.wanji.databus.dao.mapper.GreenwaveCrossMapper;
import net.wanji.databus.dao.mapper.GreenwaveHistMapper;
import net.wanji.databus.po.CrossDataHistPO;
import net.wanji.databus.po.CrossSchemeRings;
import net.wanji.databus.vo.LightsStatusVO2;
import net.wanji.opt.common.RedisUtils;
import net.wanji.opt.common.enums.EventInfoTypeEnum;
import net.wanji.opt.common.enums.GreenBeltDirEnum;
import net.wanji.opt.dao.mapper.GreenWaveRealTimeMapperV2Mapper;
......@@ -22,7 +33,6 @@ import net.wanji.opt.vo2.dto.CrossLastOptResultDTO;
import net.wanji.opt.vo2.dto.GreenLastOptResultDTO;
import net.wanji.opt.vo2.dto.GreenOptDTO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
......@@ -52,12 +62,18 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
private GreenwaveHistMapper greenwaveHistMapper;
@Resource
private StrategyGreenOptHistMapper greenOptHistMapper;
@Resource
private GreenwaveCrossMapper greenwaveCrossMapper;
@Resource
private StrategyGreenOptHistMapper strategyGreenOptHistMapper;
@Resource
private RedisUtils redisUtil;
@Resource
private BaseCrossSchemeMapper baseCrossSchemeMapper;
private static List<OptMonitoringVO> greenListCache = new ArrayList<>(10);
private static List<OptMonitoringVO> crossListCache = new ArrayList<>(80);
@Autowired
private StrategyGreenOptHistMapper strategyGreenOptHistMapper;
@Override
public List<CrossGreenStatusTimeRateVO> crossGreenStatusTimeRate() {
......@@ -75,7 +91,7 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
}
}
return crossGreenStatusTimeRateVOS;
return crossGreenStatusTimeRateVOS;
}
@Override
......@@ -262,7 +278,7 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
greenList = greenOptMonitoringList();
}
if (!CollectionUtils.isEmpty(crossListCache)) {
crossList = crossListCache;
crossList = crossListCache;
} else {
crossList = crossOptMonitoringList();
}
......@@ -287,10 +303,10 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
private static void setCountDurationRate(List<StatisticsEventTypeCountTimeVO> currentList, List<StatisticsEventTypeCountTimeVO> lastDayList) {
currentList.forEach(result -> {
for (StatisticsEventTypeCountTimeVO last : lastDayList) {
String id = result.getId();
String lastId = last.getId();
if (StringUtils.endsWithIgnoreCase(id, lastId)) {
for (StatisticsEventTypeCountTimeVO last : lastDayList) {
String id = result.getId();
String lastId = last.getId();
if (StringUtils.endsWithIgnoreCase(id, lastId)) {
if (last.getCount() == 0 || last.getDuration() == 0) {
continue;
}
......@@ -380,4 +396,69 @@ public class TrendServiceV2Impl implements TrendServiceV2 {
}
return sb.toString();
}
@Override
public GreenOptCrossOffsetVO optStrategyCrossOffsetList(Integer id) throws Exception {
GreenOptCrossOffsetVO greenOptCrossOffsetVO = new GreenOptCrossOffsetVO();
try {
List<GreenOptCrossOffsetVO.CrossOffsetDetail> oriOffsetDetails = new ArrayList<>();
List<GreenOptCrossOffsetVO.CrossOffsetDetail> curOffsetDetails = new ArrayList<>();
List<GreenwaveCrossPO> greenwaveCrossPOS = greenwaveCrossMapper.selectByGreenwaveId(id);
for (GreenwaveCrossPO greenwaveCrossPO : greenwaveCrossPOS) {
String crossId = greenwaveCrossPO.getCrossId();
GreenOptCrossOffsetVO.CrossOffsetDetail oriOffsetDetail = getOriOffsetDetail(crossId);
oriOffsetDetails.add(oriOffsetDetail);
GreenOptCrossOffsetVO.CrossOffsetDetail curOffsetDetail = getCurOffsetDetail(crossId, oriOffsetDetail);
curOffsetDetails.add(curOffsetDetail);
}
greenOptCrossOffsetVO.setOriCrossOffsets(oriOffsetDetails);
greenOptCrossOffsetVO.setCurCrossOffsets(curOffsetDetails);
} catch (Exception e) {
log.error("态势监测-策略推荐-绿波优化相位差查询失败:{}", e);
throw new RuntimeException(e);
}
return greenOptCrossOffsetVO;
}
private GreenOptCrossOffsetVO.CrossOffsetDetail getCurOffsetDetail(String crossId, GreenOptCrossOffsetVO.CrossOffsetDetail oriDetail) throws Exception {
ObjectMapper mapper = JacksonUtils.getInstance();
GreenOptCrossOffsetVO.CrossOffsetDetail curDetail = new GreenOptCrossOffsetVO.CrossOffsetDetail();
Object offsetStr = redisUtil.getHash("utc_scheme_offset", crossId);
if (Objects.isNull(offsetStr)) {
return oriDetail;
} else {
CrossSchemeRings crossSchemeRings = mapper.readValue(String.valueOf(offsetStr), CrossSchemeRings.class);
if (Objects.nonNull(crossSchemeRings)) {
Integer offset = StringUtils.isEmpty(crossSchemeRings.getOffset()) ? 0 : Integer.valueOf(crossSchemeRings.getOffset());
curDetail.setOffset(offset);
curDetail.setCrossId(crossId);
curDetail.setSchemeNo(Integer.valueOf(crossSchemeRings.getPattern()));
}
}
return curDetail;
}
private GreenOptCrossOffsetVO.CrossOffsetDetail getOriOffsetDetail(String crossId) throws Exception {
ObjectMapper mapper = JacksonUtils.getInstance();
GreenOptCrossOffsetVO.CrossOffsetDetail crossOffsetDetail = new GreenOptCrossOffsetVO.CrossOffsetDetail();
Object lightStr = redisUtil.getHash("utc_light_status", crossId);
if (!StringUtils.isEmpty(lightStr)) {
List<LightsStatusVO2> lightsStatusVO2s = mapper.readValue(String.valueOf(lightStr), new TypeReference<List<LightsStatusVO2>>() {});
String schemeId = lightsStatusVO2s.get(0).getSchemeId();
Integer schemeNo = Integer.valueOf(schemeId);
BaseCrossSchemePO baseCrossSchemePO = baseCrossSchemeMapper.selectByCrossIdAndSchemeNo(crossId, schemeNo);
crossOffsetDetail.setOffset(0);
if (Objects.nonNull(baseCrossSchemePO)) {
Integer offset = baseCrossSchemePO.getOffset();
crossOffsetDetail.setCrossId(crossId);
crossOffsetDetail.setSchemeNo(schemeNo);
crossOffsetDetail.setOffset(offset);
}
}
return crossOffsetDetail;
}
}
\ No newline at end of file
......@@ -3,10 +3,10 @@ package net.wanji.opt.servicev2.implv2;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.dao.mapper.TrunkLineMapper;
import net.wanji.opt.servicev2.TrunkLineService;
import net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity;
import net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity;
import net.wanji.opt.vo2.CrossRealTimeAlarmVO;
import net.wanji.opt.vo2.TrunkLineProblemDescribeVO;
import org.jetbrains.annotations.NotNull;
import net.wanji.opt.vo2.TrunkLineCrossProblemVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
......@@ -20,8 +20,7 @@ public class TrunkLineImpl implements TrunkLineService {
@Override
public List<TrunkLineProblemDescribeEntity> getTrunkLineProblemDescribe(String greenID , String time) {
List<TrunkLineProblemDescribeEntity> list = trunkLineMapper.getTrunkLineProblemDescribe(greenID,time);
return list;
return trunkLineMapper.getTrunkLineProblemDescribe(greenID,time);
}
@Override
......@@ -29,20 +28,108 @@ public class TrunkLineImpl implements TrunkLineService {
return trunkLineMapper.getTrunkLineRealTimeAlarm(greenID, time);
}
@NotNull
private static TrunkLineProblemDescribeVO getTrunkLineProblemDescribeVO(List<TrunkLineProblemDescribeEntity> list, int i) {
TrunkLineProblemDescribeVO vo = new TrunkLineProblemDescribeVO();
TrunkLineProblemDescribeEntity e = list.get(i);
TrunkLineProblemDescribeEntity e2= list.get(i +1);
vo.setGreenID(e.getGreenID());
vo.setTime(e.getTime());
vo.setStatus(e.getStatus());
vo.setDir(e.getDir());
vo.setStatusCN(e.getStatusCN());
vo.setDir2(e2.getDir());
vo.setStatus2(e.getStatus());
vo.setStatusCN2(e.getStatusCN());
return vo;
@Override
public List<TrunkLineCrossProblemVO> getTrunkLineCrossProblem(Integer greenID, String time) {
List<TrunkLineCrossProblemEntity> list= trunkLineMapper.getTrunkLineCrossProblem(greenID, time);
TrunkLineCrossProblemEntity ioDir = trunkLineMapper.getIODir(greenID);
List<TrunkLineCrossProblemVO> voList = new ArrayList<>();
Map<String, String> IOdirMap = getDir(ioDir.getInDir(), ioDir.getOutDir());
for (TrunkLineCrossProblemEntity e : list) {
TrunkLineCrossProblemVO vo = new TrunkLineCrossProblemVO();
vo.setCrossID(e.getCrossID());
vo.setName(e.getName());
if (e.getDirection() != null) {
Map<String, Integer> directionMap = new HashMap<>();
for (String s : e.getDirection()) {
directionMap.put(s, directionMap.getOrDefault(s, 0) + 1);
}
Integer count = directionMap.getOrDefault(IOdirMap.get("dir"), 0);
if (count == 0) { // 不匹配
vo.setStatus_1(0);
vo.setStatus_2(0);
vo.setStatus_1_name("正常");
vo.setStatus_2_name("正常");
vo.setDir_1_name(IOdirMap.get("dirName"));
vo.setDir_2_name(IOdirMap.get("dirNameReverse"));
} else if (count == 1) { // 匹配一项
vo.setStatus_1(e.getStatus());
vo.setStatus_2(0);
vo.setStatus_2_name(getStatusName(e.getStatus()));
vo.setStatus_1_name("正常");
vo.setDir_1_name(IOdirMap.get("dirName"));
vo.setDir_2_name(IOdirMap.get("dirNameReverse"));
} else if (count == 2) { // 匹配两项
vo.setStatus_1(e.getStatus());
vo.setStatus_2(e.getStatus());
vo.setStatus_1_name(getStatusName(e.getStatus()));
vo.setStatus_2_name(getStatusName(e.getStatus()));
vo.setDir_1_name(IOdirMap.get("dirName"));
vo.setDir_2_name(IOdirMap.get("dirNameReverse"));
}
voList.add(vo);
} else {
vo.setStatus_1(0);
vo.setStatus_2(0);
vo.setStatus_1_name("正常");
vo.setStatus_2_name("正常");
vo.setDir_1_name(IOdirMap.get("dirName"));
vo.setDir_2_name(IOdirMap.get("dirNameReverse"));
voList.add(vo);
}
}
return voList;
}
private Map<String, String> getDir(Integer inDir, Integer outDir) {
// 1 北 3 东 5 南 7 西
// 0 北向南 2东向西 4 西向东 6 南向北
Map<String, String> result = new HashMap<>();
if (inDir == 5 && outDir == 1) { // 南向北
result.put("dir", "6");
result.put("dirName", "南向北");
result.put("dirNameReverse", "北向南");
return result;
} else if (inDir == 7 && outDir == 3) { // 西向东
result.put("dir", "4");
result.put("dirName", "西向东");
result.put("dirNameReverse", "东向西");
return result;
} else if (inDir == 3 && outDir == 7) { // 东向西
result.put("dir", "2");
result.put("dirName", "东向西");
result.put("dirNameReverse", "西向东");
return result;
} else if (inDir == 1 && outDir == 5) { // 北向南
result.put("dir", "0");
result.put("dirName", "北向南");
result.put("dirNameReverse", "南向北");
return result;
}
return Collections.emptyMap();
}
private String getStatusName(Integer status) {
switch(status) {
case -1:
case 0:
return "正常";
case 1:
return "失衡";
case 3:
return "拥堵";
case 4:
return "死锁";
case 5:
return "相位空放";
}
return "";
}
}
package net.wanji.opt.servicev2.judgeanalysis;
import net.wanji.databus.po.BaseAreaInfoPO;
import java.util.List;
/**
* <p>
* 区域基础信息
* </p>
*
* @Author wangtao
* @Date 2025-03-18
*/
public interface BaseAreaInfoService {
List<BaseAreaInfoPO> selectByType(Integer type);
}
package net.wanji.opt.servicev2.judgeanalysis.impl;
import net.wanji.common.framework.dubbointerface.impl.BaseDubboInterfaceImpl;
import net.wanji.common.framework.mapper.BaseInterfaceMapper;
import net.wanji.databus.dao.mapper.BaseAreaInfoMapper;
import net.wanji.databus.po.BaseAreaInfoPO;
import net.wanji.opt.entity.BaseAreaInfo;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.servicev2.judgeanalysis.BaseAreaInfoService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* <p>
* 区域基础信息
* </p>
*
* @Author wangtao
* @Date 2025-03-18
*/
@Slf4j
@Component
@Service
public class BaseAreaInfoServiceImpl implements BaseAreaInfoService {
@Resource
private BaseAreaInfoMapper baseAreaInfoMapper;
/**
* 根据区划类型查询对应集合(含子集)
* @param type
* @return
*/
public List<BaseAreaInfoPO> selectByType(Integer type){
List<BaseAreaInfoPO> list = baseAreaInfoMapper.selectByType(type);
if (list.size() > 0){
list.stream().forEach(item ->{
List<BaseAreaInfoPO> areaInfoPOList = baseAreaInfoMapper.selectListByParentCode(item.getId());
if (areaInfoPOList.size() > 0){
item.setAreaInfoPOList(areaInfoPOList);
}
});
}
return list;
}
}
package net.wanji.opt.synthesis.pojo;
import lombok.Data;
@Data
public class TrunkLineCrossProblemEntity {
private String crossID;
private String name;
private Integer inDir;
private Integer outDir;
private Integer status;
private String[] direction;
private String startTime;
}
......@@ -21,4 +21,14 @@ public class CrossStatusDistributionVO {
private Double stopTimes;
@ApiModelProperty(value = "时间")
private String startTime;
@ApiModelProperty(value = "车道号", notes = "")
private Integer laneNo;
@ApiModelProperty(value = "方向", notes = "")
private Integer dirType;
@ApiModelProperty(value = "方向描述", notes = "")
private String dirTypeName;
@ApiModelProperty(value = "转向功能", notes = "")
private Integer turnType;
@ApiModelProperty(value = "转向功能描述", notes = "")
private String turnTypeName;
}
package net.wanji.opt.vo2;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author duanruiming
* @date 2025/03/18 10:11
*/
@Data
@ApiModel(value = "GreenOptCrossOffsetVO", description = "态势监测-策略推荐-绿波优化相位差实体")
public class GreenOptCrossOffsetVO {
@ApiModelProperty(value = "原始路口相位差列表")
private List<CrossOffsetDetail> oriCrossOffsets;
@ApiModelProperty(value = "当前路口相位差列表")
private List<CrossOffsetDetail> curCrossOffsets;
@Data
@ApiModel(value = "CrossOffsetDetail", description = "")
public static class CrossOffsetDetail {
@ApiModelProperty(value = "路口编号")
private String crossId;
@ApiModelProperty(value = "方案相位差")
private Integer offset;
@ApiModelProperty(value = "方案号")
private Integer schemeNo;
}
}
package net.wanji.opt.vo2;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "TrunkLineCrossProblemVO", description = "干线路口事件描述")
public class TrunkLineCrossProblemVO {
@ApiModelProperty(value = "路口ID")
private String crossID;
@ApiModelProperty(value = "路口名称")
private String name;
@ApiModelProperty(value = "状态1")
private Integer status_1;
@ApiModelProperty(value = "状态2")
private Integer status_2;
@ApiModelProperty(value = "状态1名称")
private String status_1_name;
@ApiModelProperty(value = "状态2名称")
private String status_2_name;
@ApiModelProperty(value = "方向1")
private String dir_1_name;
@ApiModelProperty(value = "方向2")
private String dir_2_name;
}
......@@ -261,7 +261,7 @@
IFNULL(t2.type, '708') AS type,
t1.wkt,
IFNULL(TIMESTAMPDIFF(SECOND, t2.start_time, IFNULL(t2.end_time, NOW())), 0) AS duration,
DATE_FORMAT(IFNULL(t2.start_time, CURDATE()), '%Y年%m月%d日%H:%i') AS startTime
DATE_FORMAT(IFNULL(t2.start_time, CURDATE()), '%H:%i:%s') AS startTime
FROM t_greenwave_info t1
LEFT JOIN (
SELECT green_id, MAX(start_time) AS start_time
......@@ -288,7 +288,7 @@
IFNULL(t2.type, '700') AS type,
REPLACE(SUBSTRING(location, 7, 18), ' ', ',') AS wkt,
IFNULL(TIMESTAMPDIFF(SECOND, t2.start_time, IFNULL(t2.end_time, NOW())), 0) AS duration,
DATE_FORMAT(IFNULL(t2.start_time, CURDATE()), '%Y年%m月%d日%H:%i') AS startTime
DATE_FORMAT(IFNULL(t2.start_time, CURDATE()), '%H:%i:%s') AS startTime
FROM t_base_cross_info t1
LEFT JOIN (
SELECT cross_id, MAX(start_time) AS start_time
......@@ -359,7 +359,7 @@
(
select distinct t1.name, t1.id, ifnull(t2.type, '708') type, t1.wkt,
ifnull(TIMESTAMPDIFF(SECOND, t2.start_time, ifnull(t2.end_time,now())), 0) duration,
DATE_FORMAT(ifnull(t2.start_time, curdate()), '%Y年%m月%d日%H:%i') as startTime,
DATE_FORMAT(ifnull(t2.start_time, curdate()), '%H:%i:%s') as startTime,
case
when t2.type = '706' then "干线缓行"
when t2.type = '707' then "干线拥堵"
......
......@@ -13,7 +13,6 @@
<result property="dir" column="dir"></result>
</resultMap>
<select id="getTrunkLineProblemDescribe" parameterType="String" resultMap="tlProblemDescribe">
select b.greenID ,b.status ,b.time , (
case
......@@ -74,5 +73,40 @@
</if>
) b
</select>
<select id="getTrunkLineCrossProblem" parameterType="map" resultType="net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity">
select
a.cross_id,
b.name,
a.`status`,
a.direction ,
MAX(a.start_time) as start_time
from
t_cross_data_hist a
left join t_base_cross_info b on
a.cross_id = b.id
where
a.cross_id in (
select
cross_id
from
t_greenwave_cross
where
green_id = #{greenID})
<if test="time != null and time != ''">
and DATE_FORMAT(a.start_time, '%Y-%m-%d %H:%i:%s') <![CDATA[ <= ]]> DATE_FORMAT(#{time}, '%Y-%m-%d %H:%i:%s')
</if>
group by
a.cross_id
</select>
<select id="getIODir" parameterType="map" resultType="net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity">
select
distinct a.in_dir,
a.out_dir
from
t_greenwave_cross a
where
a.green_id = #{greenID}
</select>
</mapper>
......@@ -127,7 +127,7 @@ public class BaseEnum {
private String nick;
public static SignalDirectionEnum getNickByCode(int code) {
public static SignalDirectionEnum getNickByCode(Integer code) {
for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) {
if (signalDirectionEnum.getCode() == code) {
return signalDirectionEnum;
......@@ -136,7 +136,7 @@ public class BaseEnum {
return null;
}
public static String getNameByCode(int code) {
public static String getNameByCode(Integer code) {
for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) {
if (signalDirectionEnum.getCode() == code) {
return signalDirectionEnum.getName();
......
......@@ -39,4 +39,6 @@ public interface BaseAreaInfoMapper {
List<BaseAreaInfoPO> selectAllArea(Integer type);
List<AreaDetailPOExt> selectAllJoinDetail(String crossName, Integer isSignal, Integer isStart, Integer isSend);
List<BaseAreaInfoPO> selectListByParentCode(Integer parentCode);
}
......@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* @author duanruiming
......@@ -46,4 +47,10 @@ public class BaseAreaInfoPO {
/** 修改时间 */
@ApiModelProperty(value = "修改时间",notes = "")
private Date gmtModified ;
/**
* 用于封装子集数据
*/
List<BaseAreaInfoPO> areaInfoPOList;
}
......@@ -131,4 +131,10 @@
ORDER BY t_cross.id
</select>
<select id="selectListByParentCode" resultType="net.wanji.databus.po.BaseAreaInfoPO">
select <include refid="baseColumnList"/>
from t_base_area_info
where parent_code = #{parentCode}
</select>
</mapper>
......@@ -24,12 +24,12 @@ import java.util.List;
public class CodeGeneratorMyBatis1 {
private static final String dburl = "jdbc:mysql://localhost:3306/wjdit_ecosystem_db_v1.0.0?serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&characterEncoding=utf8";
private static final String dburl = "jdbc:mysql://37.12.182.29:3306/wjdit_ecosystem_db_v1.0.0?serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false&characterEncoding=utf8";
private static final String userName = "root";
private static final String password = "123456";
private static final String TABLE_NAMES ="t_analysis_problem_cross_day";
private static final String password = "Wanji300552";
private static final String TABLE_NAMES ="t_base_area_info";
private static String ENTITY_NAME = null;
private static final String AUTHOR ="fengyi";
private static final String AUTHOR ="wangtao";
private static final boolean OVERITE_FILE = true; //是否覆盖源文件
private static final String PARENT_PACAGE = "net.wanji";
......@@ -69,8 +69,8 @@ public class CodeGeneratorMyBatis1 {
// 全局配置
GlobalConfig gc = new GlobalConfig();
// String projectPath = "./holo-decision-big-screen";
String projectPath = "./wj-gernerator/output";
String projectPath = "signal-optimize-service";
// String projectPath = "./wj-gernerator/output";
gc.setOutputDir(projectPath+"/src/main/java");
gc.setAuthor(AUTHOR);
......@@ -105,8 +105,8 @@ public class CodeGeneratorMyBatis1 {
pc.setController("controllerv2"+subModulePackage);
pc.setEntity("entity"+subModulePackage);
pc.setMapper("dao.mapper"+subModulePackage);
pc.setService("service2"+subModulePackage);
pc.setServiceImpl("service2"+subModulePackage+".impl");
pc.setService("servicev2"+subModulePackage);
pc.setServiceImpl("servicev2"+subModulePackage+".impl");
mpg.setPackageInfo(pc);
......
......@@ -12,6 +12,6 @@ import net.wanji.common.framework.dubbointerface.BaseDubboInterface;
* @Author ${author}
* @Date ${date}
*/
public interface ${entity}Provider extends BaseDubboInterface<${entity}> {
public interface ${entity}Service extends BaseDubboInterface<${entity}> {
}
......@@ -6,7 +6,7 @@ import net.wanji.common.framework.exception.DubboProviderException;
import net.wanji.common.framework.mapper.BaseInterfaceMapper;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.${package.ModuleName}.entity.${entity};
import net.wanji.${package.ModuleName}.service.${entity}Provider;
import net.wanji.${package.ModuleName}.service.${entity}Service;
import ${package.Mapper}.${table.mapperName};
import lombok.extern.slf4j.Slf4j;
......@@ -27,7 +27,7 @@ import javax.annotation.Resource;
@Slf4j
@Component
@Service
public class ${entity}ProviderImpl extends BaseDubboInterfaceImpl<${entity}> implements ${entity}Provider {
public class ${entity}ServiceImpl extends BaseDubboInterfaceImpl<${entity}> implements ${entity}Service {
@Resource
private ${table.mapperName} ${table.entityPath}Mapper;
......
......@@ -9,7 +9,7 @@ import net.wanji.common.framework.exception.DubboProviderException;
import net.wanji.common.framework.i18n.I18nResourceBundle;
import net.wanji.common.framework.rest.AbstractRestServer;
import net.wanji.common.framework.rest.impl.AbstractRestServerImpl;
import net.wanji.${package.ModuleName}.service.${entity}Provider;
import net.wanji.${package.ModuleName}.service.${entity}Service;
import net.wanji.${package.ModuleName}.entity.${entity};
import net.wanji.common.framework.rest.Page;
......@@ -44,8 +44,8 @@ import java.util.Map;
@RestController
@Slf4j
@RequestMapping("/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
@Api(value="${entity}RestServer", description="${table.comment!}接口", tags = "${table.comment}")
public class ${entity}RestServer extends AbstractRestServerImpl<${entity}> implements AbstractRestServer<${entity}>{
@Api(value="${entity}Controller", description="${table.comment!}接口", tags = "${table.comment}")
public class ${entity}Controller extends AbstractRestServerImpl<${entity}> implements AbstractRestServer<${entity}>{
@Autowired
private ${table.serviceName} ${table.serviceName?uncap_first};
......
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