Commit 0cf08443 authored by wangyecheng's avatar wangyecheng

Merge remote-tracking branch 'origin/master'

parents c9c0ab66 c886e08d
package net.wanji.opt.common;
import com.alibaba.fastjson.JSONArray;
import net.wanji.opt.constant.DirEnum;
import org.apache.commons.lang3.StringUtils;
/**
* @author duanruiming
* @date 2025/04/02 15:44
......@@ -16,4 +20,25 @@ public class CommonUtils {
return join;
}
/**
* 事件发生方向转换为描述
* @param dir
* @return
*/
public static String getEventHappenDirName(String dir){
StringBuilder stringBuilder = new StringBuilder();
if (StringUtils.isNotEmpty(dir)) {
JSONArray dirArr = JSONArray.parseArray(dir);
for (int i = 0; i < dirArr.size(); i++) {
String dirName = DirEnum.getName(dirArr.getString(i));
stringBuilder.append(",");
stringBuilder.append(dirName);
}
}
if (stringBuilder.length()>1){
return stringBuilder.substring(1);
}
return null;
}
}
package net.wanji.opt.constant;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* @author wanji
* @version 1.0
* Created on 2024/12/2 15:07
* @Description: [枚举类]
*/
public enum CrossEnum {
//******************************************************//
EXT_NS ("-100","延长南北方向直行的绿灯"),
EXT_EW ("-101" ,"延长东西方向直行的绿灯"),
EXT_NS_L ("-102" ,"延长南北方向左转的绿灯"),
EXT_EW_L ("-103","延长东西方向左转的绿灯"),
EXT_N2S ("-110","延长北向南直行的绿灯") ,
EXT_E2W ("-112","延长东向西直行的绿灯") ,
EXT_S2N ("-114","延长南向北直行的绿灯"),
EXT_W2E ("-116","延长西向东直行的绿灯") ,
EXT_N2S_L ("-120","延长北向南左转的绿灯"),
EXT_E2W_L ("-122","延长东向西左转的绿灯"),
EXT_S2N_L ("-124","延长南向北左转的绿灯"),
EXT_W2E_L ("-126","延长西向东左转的绿灯"),
EXT_CUR ("-150","延长当前方向的绿灯") ,
SKIP_NS ("-200","南北方向直行绿灯步进到下一个相位"),
SKIP_EW ("-201","东西方向直行绿灯步进到下一个相位"),
SKIP_NS_L ("-202","南北方向左转绿灯步进到下一个相位"),
SKIP_EW_L ("-203","东西方向左转绿灯步进到下一个相位"),
SKIP_N2S ("-210","北向南直行绿灯步进到下一个相位"),
SKIP_E2W ("-212","东向西直行绿灯步进到下一个相位"),
SKIP_S2N ("-214","南向北直行绿灯步进到下一个相位"),
SKIP_W2E ("-216","西向东直行绿灯步进到下一个相位"),
SKIP_N2S_L ("-220","北向南左转绿灯步进到下一个相位"),
SKIP_E2W_L ("-222","东向西左转绿灯步进到下一个相位"),
SKIP_S2N_L ("-224","南向北左转绿灯步进到下一个相位"),
SKIP_W2E_L ("-226","西向东左转绿灯步进到下一个相位"),
SKIP_CUR ("-250","当前绿灯步进到下一个相位"),
SKIP_E2W1 ("2","东北方向溢出,延长相位"),
SKIP_S2N2 ("3","东方向溢出,延长相位"),
SKIP_W2E3 ("4","东南方向溢出,延长相位"),
SKIP_N2S_L4 ("5","南方向溢出,延长相位"),
SKIP_E2W_L5 ("6","西南方向溢出,延长相位"),
SKIP_S2N_L6 ("7","西方向溢出,延长相位"),
SKIP_W2E_L7 ("8","西北方向溢出,延长相位"),
SKIP_CUR0 ("1","北方向溢出,延长相位");
//******************************************************//
private String type;
private String name;
CrossEnum(String type, String name) {
this.type = type;
this.name = name;
}
public static String getName(String type) {
for (CrossEnum typeEnum : CrossEnum.values()) {
if (Objects.equals(typeEnum.type, type)) {
return typeEnum.name;
}
}
return null;
}
public static CrossEnum getTypeEnum(String type) {
for (CrossEnum typeEnum : CrossEnum.values()) {
if (Objects.equals(typeEnum.type, type)) {
return typeEnum;
}
}
return null;
}
public String getType() {
return type;
}
public String getName() {
return name;
}
//空放相位延长
public static final List<CrossEnum> ExtendPhaseList = Arrays.asList(
new CrossEnum[] {
CrossEnum.EXT_NS,
CrossEnum.EXT_EW,
CrossEnum.EXT_NS_L,
CrossEnum.EXT_EW_L,
CrossEnum.EXT_N2S,
CrossEnum.EXT_E2W,
CrossEnum.EXT_S2N,
CrossEnum.EXT_W2E,
CrossEnum.EXT_N2S_L,
CrossEnum.EXT_E2W_L,
CrossEnum.EXT_S2N_L,
CrossEnum.EXT_W2E_L,
CrossEnum.EXT_CUR
}
);
/**
* 是否为延长相位
* @param crossEnum
* @return
*/
public static boolean isExtendPhase(CrossEnum crossEnum){
return ExtendPhaseList.contains(crossEnum);
}
//空放相位切换
public static final List<CrossEnum> SwitchPhaseList = Arrays.asList(
new CrossEnum[] {
CrossEnum.SKIP_NS,
CrossEnum.SKIP_EW,
CrossEnum.SKIP_NS_L,
CrossEnum.SKIP_EW_L,
CrossEnum.SKIP_N2S,
CrossEnum.SKIP_E2W,
CrossEnum.SKIP_S2N,
CrossEnum.SKIP_W2E,
CrossEnum.SKIP_N2S_L,
CrossEnum.SKIP_E2W_L,
CrossEnum.SKIP_S2N_L,
CrossEnum.SKIP_W2E_L,
CrossEnum.SKIP_CUR
}
);
/**
* 是否为切换相位
* @param crossEnum
* @return
*/
public static boolean isSwitchPhase(CrossEnum crossEnum){
return SwitchPhaseList.contains(crossEnum);
}
public static void main(String[] args) {
System.out.println(CrossEnum.getTypeEnum("-100").type);
}
}
package net.wanji.opt.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
@SuppressWarnings("all")
public enum DirEnum {
//******************************************************//
NORTH("1", "北"),
EAST_NORTH("2", "东北"),
EAST("3", "东"),
EAST_SOUTH("4", "东南"),
SOUTH("5", "南"),
WEST_SOUTH("6", "西南"),
WEST("7", "西"),
WEST_NORTH("8", "西北");
//******************************************************//
private String type;
private String name;
DirEnum(String type, String name) {
this.type = type;
this.name = name;
}
public static String getName(String type) {
for (DirEnum typeEnum : DirEnum.values()) {
if (Objects.equals(typeEnum.type, type)) {
return typeEnum.name;
}
}
return null;
}
public static String getType(DirEnum type) {
for (DirEnum typeEnum : DirEnum.values()) {
if (Objects.equals(typeEnum, type)) {
return typeEnum.type;
}
}
return null;
}
/**
* 八方向
*/
@Getter
@AllArgsConstructor
public enum SignalDirectionEnum {
N(1, "北", "N"),
EN(2, "东北", "EN"),
E(3, "东", "E"),
ES(4, "东南", "ES"),
S(5, "南", "S"),
WS(6, "西南", "WS"),
W(7, "西", "W"),
WN(8, "西北", "WN");
private Integer code;
private String name;
private String nick;
public static SignalDirectionEnum getNickByCode(int code) {
for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) {
if (signalDirectionEnum.getCode() == code) {
return signalDirectionEnum;
}
}
return null;
}
public static String getNameByCode(int code) {
for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) {
if (signalDirectionEnum.getCode() == code) {
return signalDirectionEnum.getName();
}
}
return null;
}
public static SignalDirectionEnum getNameByNick(String nick) {
for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) {
if (signalDirectionEnum.getNick().equals(nick)) {
return signalDirectionEnum;
}
}
return null;
}
public static Integer getCodeByName(String name) {
for (SignalDirectionEnum signalDirectionEnum : SignalDirectionEnum.values()) {
if (Objects.equals(signalDirectionEnum.getName(), name)) {
return signalDirectionEnum.getCode();
}
}
return null;
}
}
}
......@@ -55,7 +55,8 @@ class CrossProblemTotalityResultResponse {
private String weekCongestDurationCompare;
//================================================================================================//
@ApiModelProperty(value = "本周总体效果情况", example = "明显提升",position = 9)
private String weekTotalitySituation;
private List<CrossProblemTotalityData> dataList=new ArrayList<>();
......
package net.wanji.opt.dao.mapper.report;
import net.wanji.opt.entity.report.AnalysisGreenWaveOptimizeWeek;
import net.wanji.opt.entity.report.AnalysisReportCrossOptimizeDetail;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface AnalysisReportCrossOptimizeDetailMapper extends BaseMapper<AnalysisReportCrossOptimizeDetail>{
/**
* 查询表t_analysis_report_cross_optimize_detail所有信息
*/
List<AnalysisReportCrossOptimizeDetail> findAllAnalysisReportCrossOptimizeDetail();
/**
* 根据主键crossId查询表t_analysis_report_cross_optimize_detail信息
* @param crossId
*/
AnalysisReportCrossOptimizeDetail findAnalysisReportCrossOptimizeDetailBycrossId(@Param("crossId") String crossId);
/**
* 根据条件查询表t_analysis_report_cross_optimize_detail信息
* @param analysisReportCrossOptimizeDetail
*/
List<AnalysisReportCrossOptimizeDetail> findAnalysisReportCrossOptimizeDetailByCondition(AnalysisReportCrossOptimizeDetail analysisReportCrossOptimizeDetail);
/**
* 根据主键crossId查询表t_analysis_report_cross_optimize_detail信息
* @param crossId
*/
Integer deleteAnalysisReportCrossOptimizeDetailBycrossId(@Param("crossId") String crossId);
/**
* 根据主键crossId更新表t_analysis_report_cross_optimize_detail信息
* @param analysisReportCrossOptimizeDetail
*/
Integer updateAnalysisReportCrossOptimizeDetailBycrossId(AnalysisReportCrossOptimizeDetail analysisReportCrossOptimizeDetail);
/**
* 新增表t_analysis_report_cross_optimize_detail信息
* @param analysisReportCrossOptimizeDetail
*/
Integer addAnalysisReportCrossOptimizeDetail(AnalysisReportCrossOptimizeDetail analysisReportCrossOptimizeDetail);
/**
* 批量插入
* @param list
*/
void insertBatch(List<AnalysisReportCrossOptimizeDetail> list);
}
package net.wanji.opt.entity.report;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.baomidou.mybatisplus.annotation.TableName;
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("t_analysis_report_cross_optimize_detail")
public class AnalysisReportCrossOptimizeDetail implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 路口ID
*/
@TableId(value = "cross_id", type = IdType.AUTO)
private String crossId;
/**
* 星期几:1~7代表周一至周日
*/
private Integer weekDay;
/**
* 优化时段开始时间
*/
private LocalDateTime optimizeStartTime;
/**
* 优化时段截止时间
*/
private LocalDateTime optimizeEndTime;
/**
* 策略类型 干线当前策略:1单条 2垂直 3平行
*/
private Integer stragetyId;
/**
* 策略时段内优化次数
*/
private Integer optimizeCount;
/**
* 策略时段内优化总时长,单位秒
*/
private Integer optimizeDuration;
/**
* 通行能力(辆)
*/
private Integer capacity;
/**
* 停车次数
*/
private Double stopTimes;
/**
* 延误时间,单位秒
*/
private Double delayTime;
/**
* 最大排队长度
*/
private Integer maxQueueLength;
/**
* 一年中的第几周
*/
private Integer yearWeek;
/**
* 一一年中的第几周,格式yyyyw,如20251
*/
private LocalDateTime weekStartTime;
/**
* 一周的第二天
*/
private LocalDateTime weekEndTime;
/**
* 数据插入时间
*/
private LocalDateTime insertTime;
/**
* 上周通行能力(辆)
*/
private Integer lastWeekCapacity;
/**
* 上周停车次数
*/
private Double lastWeekStopTimes;
/**
* 上周延误时间,单位秒
*/
private Double lastWeekDelayTime;
/**
* 上周最大排队长度
*/
private Integer lastWeekMaxQueueLength;
/**
* 上周平均速度,单位km/h
*/
private Double lastWeekSpeed;
/**
* 上周拥堵指数
*/
private Double lastWeekCongestIndex;
/**
* 事件问题方向[]
*/
private String dirs;
}
package net.wanji.opt.servicev2.evaluation.impl;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.dubbointerface.impl.BaseDubboInterfaceImpl;
import net.wanji.common.framework.mapper.BaseInterfaceMapper;
import net.wanji.opt.common.CommonUtils;
import net.wanji.opt.common.Tools;
import net.wanji.opt.dao.mapper.evaluation.EventInfoMapper;
import net.wanji.opt.entity.evaluation.EventInfo;
import net.wanji.opt.servicev2.evaluation.EventInfoService;
......@@ -13,6 +16,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
......@@ -38,7 +42,15 @@ public class EventInfoServiceImpl extends BaseDubboInterfaceImpl<EventInfo> impl
}
public List<Map<String,Object>> getListByStartAndEnd(Map<String, Object> map){
return this.eventInfoMapper.getListByStartAndEnd(map);
List<Map<String,Object>> list = this.eventInfoMapper.getListByStartAndEnd(map);
for (Map<String,Object> data : list) {
String dir = Tools.getMapValue("dir",data);
if (Objects.nonNull(dir) && dir.length()>2){
String dirName = CommonUtils.getEventHappenDirName(dir);
data.put("dirName",dirName);
}
}
return list;
}
}
......@@ -51,7 +51,8 @@ public class AnalysisProblemAndStrategyDayImpl extends ServiceImpl<AnalysisProbl
String formattedDate = previousDay.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
vo.setDt(formattedDate);
vo.setInsertTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//路口数据设置干线ID为不存在的ID
vo.setGreenId("-1");
//写入数据--Error
analysisProblemAndStrategyDayMapper.insertProblemAndStrategy(vo);
}
......@@ -74,7 +75,8 @@ public class AnalysisProblemAndStrategyDayImpl extends ServiceImpl<AnalysisProbl
String formattedDate = previousDay.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
vo.setDt(formattedDate);
vo.setInsertTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//干线数据设置路口ID为不存在的null字符串
vo.setCrossId("null");
//写入数据
analysisProblemAndStrategyDayMapper.insertProblemAndStrategy(vo);
}
......
package net.wanji.opt.servicev2.report;
import net.wanji.opt.entity.report.AnalysisReportCrossOptimizeDetail;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author fengyi
* @since 2025-04-14
*/
public interface AnalysisReportCrossOptimizeDetailService extends IService<AnalysisReportCrossOptimizeDetail> {
/**
* 详情
* @param id
* @return
*/
AnalysisReportCrossOptimizeDetail info(Long id);
/**
* 新增
* @param param 根据需要进行传值
* @return
*/
void add(AnalysisReportCrossOptimizeDetail param);
/**
* 修改
* @param param 根据需要进行传值
* @return
*/
void modify(AnalysisReportCrossOptimizeDetail param);
/**
* 删除(单个条目)
* @param id
* @return
*/
void remove(Long id);
/**
* 删除(多个条目)
* @param ids
* @return
*/
void removes(List<Long> ids);
}
package net.wanji.opt.servicev2.report.impl;
import net.wanji.opt.entity.report.AnalysisReportCrossOptimizeDetail;
import net.wanji.opt.dao.mapper.report.AnalysisReportCrossOptimizeDetailMapper;
import net.wanji.opt.servicev2.report.AnalysisReportCrossOptimizeDetailService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.List;
/**
* <p>
* 服务实现类
* </p>
*
* @author fengyi
* @since 2025-04-14
*/
@Service
public class AnalysisReportCrossOptimizeDetailServiceImpl extends ServiceImpl<AnalysisReportCrossOptimizeDetailMapper, AnalysisReportCrossOptimizeDetail> implements AnalysisReportCrossOptimizeDetailService {
@Resource
private AnalysisReportCrossOptimizeDetailMapper analysisReportCrossOptimizeDetailMapper;
/**
* 详情
* @param id
* @return
*/
@Override
public AnalysisReportCrossOptimizeDetail info(Long id) {
return getById(id);
}
/**
* 新增
* @param param 根据需要进行传值
* @return
*/
@Override
public void add(AnalysisReportCrossOptimizeDetail param) {
save(param);
}
/**
* 修改
* @param param 根据需要进行传值
* @return
*/
@Override
public void modify(AnalysisReportCrossOptimizeDetail param) {
updateById(param);
}
/**
* 删除(单个条目)
* @param id
* @return
*/
@Override
public void remove(Long id) {
removeById(id);
}
/**
* 删除(多个条目)
* @param ids
* @return
*/
@Override
public void removes(List<Long> ids) {
removeByIds(ids);
}
}
......@@ -66,4 +66,7 @@ public class StrategyCrossResultEntity {
private String empty_dir;
@TableField("dt")
private Integer dt;
@TableField("event_id")
private String eventId;
}
......@@ -439,7 +439,8 @@
DATE_FORMAT(end_time,'%Y-%m-%d %H:%i:%s') endTime,
ABS(TIMESTAMPDIFF( SECOND, start_time, end_time )) AS duration,
info.type,
c.label as typeName
c.label as typeName,
dir
FROM t_event_info info
JOIN t_config_event_category c ON info.type = c.event_type
WHERE cross_id = #{crossId}
......
/**
*
*/
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import net.wanji.opt.SignalOptimizeApplication;
import net.wanji.opt.servicev2.judgeanalysis.AnalysisProblemCrossDayService;
import net.wanji.opt.task.OptimizeStatisticTask;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* @author fengyi
* @date
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SignalOptimizeApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OptimizeStatisticTaskTest {
@Resource
OptimizeStatisticTask optimizeStatisticTask;
@Test
public void testProducerTrack() {
DateTime dateTime = DateUtil.lastWeek();
dateTime = DateUtil.beginOfWeek(dateTime.toJdkDate());
String start = dateTime.toString("yyyy-MM-dd HH:mm:ss");
String end = DateUtil.now();
//测试运行上周一到现在的数据
optimizeStatisticTask.optimizeDurationCal();
}
}
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