Commit 200df50a authored by 黄伟铭's avatar 黄伟铭

Merge remote-tracking branch 'origin/master'

parents 5fceec3e ad3a6a77
......@@ -72,7 +72,15 @@ public class AnalysisProblemCrossDay implements Serializable {
*/
private LocalDateTime insertTime;
private String seriousTimeSpan;
private Integer seriousDuration;
private String timeSpanList;
private Integer weekDay;
private Integer yearWeek;
/***非数据库字段****/
//类型名称
......@@ -80,4 +88,7 @@ public class AnalysisProblemCrossDay implements Serializable {
//数量统计
private String countNumber;
}
......@@ -55,9 +55,9 @@ import java.util.stream.Collectors;
* @desc 诱导信息下发监测
*/
@RequiredArgsConstructor
@Component
//@Component
@Slf4j
@Profile("docker")
//@Profile("docker")
public class InducesMonitorTask {
@Autowired
......@@ -94,7 +94,7 @@ public class InducesMonitorTask {
* #绿波调度计划扫描周期
* 2 分钟 120000
*/
@Scheduled(fixedRate = 120000)
//@Scheduled(fixedRate = 120000)
public void refresh() throws Exception {
long start = System.currentTimeMillis();
AtomicLong synCount = new AtomicLong();
......
......@@ -192,7 +192,7 @@ public class OptimizeStatisticTask {
* 单点策略优化时长计算
*/
// @Scheduled(cron = "0 0/6 * * * * ")
//@Scheduled(cron = "0 20 3 * * * ")
@Scheduled(cron = "0 20 3 * * * ")
public void optimizeDurationCal() {
long st = System.currentTimeMillis();
......@@ -200,14 +200,15 @@ public class OptimizeStatisticTask {
//路口策略下方记录
Date nowDate = cn.hutool.core.date.DateUtil.date();
Date beginOfDay = cn.hutool.core.date.DateUtil.lastWeek();//.beginOfDay(nowDate);
beginOfDay = cn.hutool.core.date.DateUtil.beginOfWeek(beginOfDay);
Date beginOfDay = cn.hutool.core.date.DateUtil.beginOfDay(nowDate);//.lastWeek();//
//beginOfDay = cn.hutool.core.date.DateUtil.beginOfWeek(beginOfDay);
Date endOfDay = cn.hutool.core.date.DateUtil.endOfDay(nowDate);//DateUtil.endOfDay(DateUtil.date());
while (beginOfDay.before(endOfDay)) {
String startDate = cn.hutool.core.date.DateUtil.format(beginOfDay, "yyyy-MM-dd HH:mm:ss");
beginOfDay = cn.hutool.core.date.DateUtil.offsetDay(beginOfDay,1);
beginOfDay = cn.hutool.core.date.DateUtil.offsetDay(beginOfDay, 1);
String endDate = cn.hutool.core.date.DateUtil.format(beginOfDay, "yyyy-MM-dd HH:mm:ss");
//==========================================================================================================//
......@@ -245,23 +246,29 @@ public class OptimizeStatisticTask {
//==========================================================================================================//
List<AnalysisReportCrossOptimizeDetail> optimizeList = new ArrayList<>();
Map<String, List<StrategyCrossResultEntity>> groupByCross = list.stream().collect(Collectors.groupingBy(StrategyCrossResultEntity::getCrossId));
Map<String, List<StrategyCrossResultEntity>> groupByCross = list.stream().collect(Collectors.groupingBy(o -> o.getCrossId() + "_" + o.getCurrentAlgo()));
for (Map.Entry<String, List<StrategyCrossResultEntity>> entry : groupByCross.entrySet()) {
String[] sps = entry.getKey().split("_");
String crossId = sps[0];
String strategy = sps[1];
List<StrategyCrossResultEntity> value = entry.getValue();
StrategyCrossResultEntity minTime = value.stream().min(Comparator.comparing(o->o.getIssueTime())).orElse(new StrategyCrossResultEntity());
StrategyCrossResultEntity maxTime = value.stream().max(Comparator.comparing(o->o.getIssueTime())).orElse(new StrategyCrossResultEntity());
int duration = value.stream().mapToInt(o->o.getDuration()).sum();
StrategyCrossResultEntity minTime = value.stream().min(Comparator.comparing(o -> o.getIssueTime())).orElse(new StrategyCrossResultEntity());
StrategyCrossResultEntity maxTime = value.stream().max(Comparator.comparing(o -> o.getIssueTime())).orElse(new StrategyCrossResultEntity());
int duration = value.stream().mapToInt(o -> o.getDuration()).sum();
long count = value.size();
//优化控制时段-开始时间
String controlStartTime = DateUtil.formatDate(minTime.getIssueTime(), "yyyy-MM-dd HH:mm:ss");
//优化控制时段-截止时间
String controlEndTime = new DateTime(maxTime.getIssueTime()).plusSeconds(duration).toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
DateTime optStartTime = DateTime.parse(controlStartTime, DateTimeFormat.forPattern(EsDateIndexUtil.YMD_HM_FORMATTER)).minusMinutes(15);
DateTime optStartTime = DateTime.parse(controlStartTime, DateTimeFormat.forPattern(EsDateIndexUtil.YMD_HM_FORMATTER));
String optStartTimeStr = controlStartTime.substring(0, controlStartTime.indexOf(" ") + 1) + Tools.fillZeroFront(optStartTime.getHourOfDay() + "", 2) + ":" + Tools.fillZeroFront((int) Math.ceil(optStartTime.getMinuteOfHour() / 5) * 5 + "", 2) + ":00";
Map<String, Object> params = new HashMap<>();
params.put("crossId", entry.getKey());
params.put("crossId", crossId);
params.put("startDate", optStartTimeStr);
params.put("endDate", controlEndTime);
params.put("groupType", "0");
......@@ -271,12 +278,13 @@ public class OptimizeStatisticTask {
AnalysisReportCrossOptimizeDetail thisData = this.getWeedData(thisWeekList);
//上周策略同期-开始时间
DateTime lastWeekDateStartTime = optStartTime.minusWeeks(1).minusMinutes(15);
;
DateTime lastWeekDateStartTime = optStartTime.minusWeeks(1);
DateTime lastWeekDateEndTime = new DateTime(maxTime.getIssueTime()).plusSeconds(duration).minusWeeks(1);
String lastWeekStartTime = lastWeekDateStartTime.toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
String lastOptStartTimeStr = lastWeekStartTime.substring(0, lastWeekStartTime.indexOf(" ") + 1) + Tools.fillZeroFront(lastWeekDateStartTime.getHourOfDay() + "", 2) + ":" + Tools.fillZeroFront((int) Math.ceil(lastWeekDateStartTime.getMinuteOfHour() / 5) * 5 + "", 2) + ":00";
//上周策略同期-截止时间
String lastWeekEndTime = lastWeekDateStartTime.plusSeconds(minTime.getDuration()).toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
String lastWeekEndTime = lastWeekDateEndTime.toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
params.put("startDate", lastOptStartTimeStr);
params.put("endDate", lastWeekEndTime);
//上周指标数据
......@@ -292,7 +300,7 @@ public class OptimizeStatisticTask {
detail.setWeekStartTime(cn.hutool.core.date.DateUtil.beginOfWeek(minTime.getIssueTime()).toLocalDateTime());
;
detail.setWeekEndTime(cn.hutool.core.date.DateUtil.endOfWeek(minTime.getIssueTime()).toLocalDateTime());
detail.setOptimizeCount((int)count);
detail.setOptimizeCount((int) count);
detail.setOptimizeDuration(duration);
detail.setOptimizeStartTime(LocalDateTime.parse(controlStartTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
detail.setOptimizeEndTime(LocalDateTime.parse(controlEndTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
......@@ -305,6 +313,7 @@ public class OptimizeStatisticTask {
detail.setLastWeekStopTimes(lastData.getStopTimes());
detail.setLastWeekDelayTime(lastData.getDelayTime());
detail.setLastWeekMaxQueueLength(lastData.getMaxQueueLength());
detail.setInsertTime(LocalDateTime.now());
String eventSerialNumber = minTime.getEventId();
Map<String, Object> eventParma = new HashMap<>();
......@@ -316,10 +325,10 @@ public class OptimizeStatisticTask {
detail.setDirs(CommonUtils.getEventHappenDirName(dir));
}
optimizeList.add(detail);
if (optimizeList.size() % 500 == 0) {
if (optimizeList.size() % 100 == 0) {
analysisReportCrossOptimizeDetailMapper.insertBatch(optimizeList);
optimizeList.clear();
log.info("计算路口周报-路口优分批入库耗时:{}ms,size:{} ,starDate:{}", System.currentTimeMillis() - et1,optimizeList.size(), startDate);
log.info("计算路口周报-路口优分批入库耗时:{}ms,size:{} ,starDate:{}", System.currentTimeMillis() - et1, optimizeList.size(), startDate);
}
}
//==========================================================================================================//
......
......@@ -5,7 +5,7 @@
<!-- 通用设置 -->
<!-- 通用查询列 -->
<sql id="Base_Column_List">
id, area_id, event_category, event_type, event_number, event_total_time, window_start_time, window_end_time, cross_id, dt, insert_time
id, area_id, event_category, event_type, event_number, event_total_time, window_start_time, window_end_time, cross_id, dt, insert_time,serious_time_span,serious_duration,time_span_list,week_day,year_week
</sql>
<!-- 通用条件列 -->
......@@ -92,6 +92,12 @@
<result column="cross_id" property="crossId"/>
<result column="dt" property="dt"/>
<result column="insert_time" property="insertTime"/>
<result column="serious_time_span" property="seriousTimeSpan"/>
<result column="serious_duration" property="seriousDuration"/>
<result column="time_span_list" property="timeSpanList"/>
<result column="week_day" property="weekDay"/>
<result column="year_week" property="yearWeek"/>
</resultMap>
<!-- 通用查询映射结果 -->
......@@ -203,28 +209,58 @@
<!-- 新增表t_analysis_problem_cross_day信息 -->
<insert id="insertAnalysisProblemCrossDay">
insert into t_analysis_problem_cross_day (id,cross_id,area_id,event_category,event_type,event_number,event_total_time,dt,insert_time)
select UUID(), a.cross_id, b.area_id,a.category,a.type,count(1) as event_number , sum( TIMESTAMPDIFF(SECOND, a.start_time , a.end_time) ) as duration ,
DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 DAY),'%Y%m%d') as dt , now()
from t_event_info a
left join t_base_cross_info b on a.cross_id = b.id
where DATE_FORMAT(a.start_time,'%Y-%m-%d') = DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 DAY),'%Y-%m-%d') and a.type in (701,702,703,707)
group by a.cross_id, b.area_id,a.category,a.type
ON DUPLICATE KEY UPDATE
id=VALUES(id),
cross_id=VALUES(cross_id),
area_id=VALUES(area_id),
event_category=VALUES(event_category),
event_type=VALUES(event_type),
event_number=VALUES(event_number),
event_total_time=VALUES(event_total_time),
window_start_time=VALUES(window_start_time),
window_end_time=VALUES(window_end_time),
dt=VALUES(dt),
insert_time=VALUES(insert_time)
</insert>
<!-- 先设置会话级group_conct的最大长度 -->
SET SESSION group_concat_max_len = 1048576;
insert into t_analysis_problem_cross_day (id,cross_id,area_id,event_category,event_type,event_number,event_total_time,dt,insert_time,
serious_time_span,serious_duration,time_span_list,week_day,year_week)
select UUID(), a.cross_id, b.area_id,a.category,a.type,count(1) as event_number , sum( TIMESTAMPDIFF(SECOND, a.start_time , a.end_time) ) as duration ,
DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 DAY),'%Y%m%d') as dt , now(),
SUBSTRING_INDEX(
GROUP_CONCAT(
CONCAT(
date_format(a.start_time,'%H:%i:%s'),
'~',
CONCAT(date_format(a.end_time,'%H:%i:%s'))
)
ORDER BY TIMESTAMPDIFF( SECOND, a.start_time, a.end_time ) desc
)
,',',1) as serious_time_span,
max(TIMESTAMPDIFF( SECOND, a.start_time, a.end_time )) as serious_duration,
GROUP_CONCAT(CONCAT(
date_format(a.start_time,'%H:%i:%s'),
'~',
CONCAT(date_format(a.end_time,'%H:%i:%s'))
)
) time_span_list,
(WEEKDAY(start_time)+1) week_day,
concat(year(start_time),'',(week(start_time)+1)) year_week
from t_event_info a
left join t_base_cross_info b on a.cross_id = b.id
where dt = DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 DAY),'%Y%m%d') and a.type in (701,702,703,707)
group by a.cross_id, b.area_id,a.category,a.type
ON DUPLICATE KEY UPDATE
id=VALUES(id),
cross_id=VALUES(cross_id),
area_id=VALUES(area_id),
event_category=VALUES(event_category),
event_type=VALUES(event_type),
event_number=VALUES(event_number),
event_total_time=VALUES(event_total_time),
window_start_time=VALUES(window_start_time),
window_end_time=VALUES(window_end_time),
dt=VALUES(dt),
insert_time=VALUES(insert_time),
serious_time_span=VALUES(serious_time_span),
serious_duration=VALUES(serious_duration),
time_span_list=VALUES(time_span_list),
week_day=VALUES(week_day),
year_week=VALUES(year_week)
</insert>
<!-- 新增表t_analysis_problem_cross_dir_hour信息 -->
<!-- 新增表t_analysis_problem_cross_dir_hour信息 -->
<insert id="insertAnalysisProblemCrossHour">
insert into t_analysis_problem_cross_dir_hour (id,cross_id,area_id,event_category,event_type,dir,event_number,event_total_time,window_start_time,window_end_time,dt,insert_time)
select uuid(), d.cross_id, e.area_id,d.category,d.type,d.dir,count(1) as event_number , sum( TIMESTAMPDIFF(SECOND, d.start_time , d.end_time) ) as duration ,
......
/**
*
*/
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import net.wanji.opt.SignalOptimizeApplication;
import net.wanji.opt.dao.mapper.judgeanalysis.AnalysisProblemCrossDayMapper;
import net.wanji.opt.task.AnalysisProblemDayTask;
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.beans.factory.annotation.Autowired;
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 AnalysisProblemDayTaskTest {
@Autowired
private AnalysisProblemCrossDayMapper analysisProblemCrossDayMapper;
@Test
public void testProducerTrack() {
long st = System.currentTimeMillis();
analysisProblemCrossDayMapper.insertAnalysisProblemCrossDay();
long et = System.currentTimeMillis();
System.out.println((et-st)+"ms");
}
}
......@@ -10,6 +10,6 @@ spring:
password: nacos
application:
# dubbo启动需要程序名称
name: signal-optimize-service
name: signal-optimize-data-compute
main:
allow-circular-references: true
......@@ -13,6 +13,7 @@ import net.wanji.opt.controllerv2.report.design.CrossRunStateAnalysisResult;
import net.wanji.opt.controllerv2.report.design.CrossRunStatePeakAnalysisResult;
import net.wanji.opt.controllerv2.report.design.GreenReportRunStateResult;
import net.wanji.opt.controllerv2.report.vo.CrossRunStateAnalysisResultResponseDTO;
import net.wanji.opt.controllerv2.report.vo.CrossRunStatePeakResultResponseVO;
import net.wanji.opt.servicev2.report.AnalysisGreenWavePeakDetailService;
import net.wanji.opt.servicev2.report.CrossRidLaneService;
import net.wanji.opt.vo2.report.GreenReportRunStateResponseVO;
......@@ -44,9 +45,9 @@ public class CrossRunStateController {
@ApiOperation(httpMethod="GET",value="2.1-交通运行总体情况", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "crossIds", value = "路口ID,多个id用','分隔【为空时查询所有】", required = true, dataType = "String",defaultValue = "13NEJ0B5R80,13N650B5P30"),
@ApiImplicitParam(name = "crossIds", value = "路口ID,多个id用','分隔【为空时查询所有】", required = false, dataType = "String",defaultValue = "13NEJ0B5R80,13N650B5P30"),
@ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String",defaultValue = "2025"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "14"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "15"),
})
@GetMapping(value = "/getTotalitySituation")
@ApiResponses({
......@@ -66,18 +67,19 @@ public class CrossRunStateController {
@ApiOperation(httpMethod="GET",value="2.2-区域路口运行分析", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "crossIds", value = "路口ID,多个id用','分隔【为空时查询所有】", required = true, dataType = "String",defaultValue = "13NEJ0B5R80,13N650B5P30"),
@ApiImplicitParam(name = "crossIds", value = "路口ID,多个id用','分隔【为空时查询所有】", required = false, dataType = "String",defaultValue = "13NEJ0B5R80,13N650B5P30"),
@ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String",defaultValue = "2025"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "14"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "15"),
})
@GetMapping(value = "/getPeakData")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = CrossRunStatePeakAnalysisResult.class),
})
public JsonViewObject getPeakData(String crossIds,Integer year,Integer week) {
public JsonViewObject getPeakData(@RequestParam(required = false) String crossIds,Integer year,Integer week) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try {
List<CrossRunStatePeakResultResponseVO> resultResponseVOList = crossRidLaneService.getPeakData(crossIds,year,week);
jsonViewObject.success(resultResponseVOList);
} catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
......
......@@ -36,19 +36,19 @@ class CrossOptimizeResultResponse {
@ApiModelProperty(value = "路口名称", example = "经十路(舜耕路-山大路)",position = 0)
private String crossName;
@ApiModelProperty(value = "本周优化次数", example = "300",position = 1)
@ApiModelProperty(value = "本周优化次数", example = "300",position = 1)
private String weekOptimizeCount;
@ApiModelProperty(value = "本周优化时长", example = "98小时",position = 2)
@ApiModelProperty(value = "本周优化时长", example = "98",position = 2)
private String weekOptimizeDuration;
@ApiModelProperty(value = "本周溢出次数", example = "98小时",position = 3)
@ApiModelProperty(value = "本周溢出次数", example = "98",position = 3)
private String weekOptimizeOverflowCount;
@ApiModelProperty(value = "本周拥堵次数", example = "98小时",position = 4)
@ApiModelProperty(value = "本周拥堵次数", example = "98",position = 4)
private String weekOptimizeCongestCount;
@ApiModelProperty(value = "本周空放优化次数", example = "98小时",position = 5)
@ApiModelProperty(value = "本周空放优化次数", example = "98",position = 5)
private String weekOptimizeEmptyCount;
@ApiModelProperty(value = "本周失衡优化次数", example = "98小时",position = 6)
@ApiModelProperty(value = "本周失衡优化次数", example = "98",position = 6)
private String weekOptimizeUnbalanceCount;
@ApiModelProperty(value = "本周通行能力同比情况", example = "提升10%",position = 7)
......
......@@ -72,8 +72,8 @@ class ImportCrossAnalysisResponse {
//================================================================================================//
@ApiModelProperty(value = "本周停车次数", example = "22",position = 14)
private String avgStopTimes;
@ApiModelProperty(value = "平均拥堵指数与上周相比情况", example = "增加【减少】10%",position = 15)
private String avgCongestIndexCompare;
@ApiModelProperty(value = "本周停车次数与上周相比情况", example = "增加【减少】10%",position = 15)
private String avgStopTimesCompare;
//================================================================================================//
@ApiModelProperty(value = "本周最大排队长度", example = "203",position = 16)
private String maxQueueLength;
......
......@@ -88,6 +88,52 @@ public class TimeIntervalMerger {
return result.toString();
}
public static String toTimeString(List<String> timeStrings) {
// 解析时间字符串为 TimeInterval 对象
List<TimeInterval> intervals = timeStrings.stream()
.map(timeStr -> {
String[] parts = timeStr.split("~");
LocalTime start = LocalTime.parse(parts[0].trim(), TIME_FORMATTER);
LocalTime end = LocalTime.parse(parts[1].trim(), TIME_FORMATTER);
return new TimeInterval(start, end);
})
.sorted(Comparator.comparing(TimeInterval::getStart)) // 按开始时间排序
.collect(Collectors.toList());
// 合并重叠的区间
List<TimeInterval> mergedIntervals = new ArrayList<>();
for (TimeInterval current : intervals) {
if (mergedIntervals.isEmpty() || !current.overlapsWith(mergedIntervals.get(mergedIntervals.size() - 1))) {
mergedIntervals.add(current); // 如果不重叠,直接添加
} else {
// 如果重叠,合并当前区间与最后一个区间
TimeInterval last = mergedIntervals.get(mergedIntervals.size() - 1);
mergedIntervals.set(mergedIntervals.size() - 1, last.mergeWith(current));
}
}
// 按时间段长度从大到小排序
mergedIntervals.sort((t1, t2) -> Long.compare(t2.getDurationInSeconds(), t1.getDurationInSeconds()));
// 截取前三个时间段
List<TimeInterval> topThreeIntervals = mergedIntervals.stream()
.limit(3)
.sorted(Comparator.comparing(TimeInterval::getStart)) // 按开始时间重新排序
.collect(Collectors.toList());
// 拼接结果字符串
StringBuilder result = new StringBuilder();
for (int i = 0; i < topThreeIntervals.size(); i++) {
TimeInterval interval = topThreeIntervals.get(i);
if (i > 0) {
result.append(",");
}
result.append(interval.getStart()).append("~").append(interval.getEnd());
break;
}
return result.toString();
}
// 测试代码
public static void main(String[] args) {
......
......@@ -8,9 +8,9 @@ public class CrossPeakAnalysis {
// 路口 ID
private String crossId;
// 类型:1工作日 2节假日
private Integer dayType;
private String dayType;
// 高峰类型 1早高峰 2晚高峰 3平峰
private Integer peakType;
private String peakType;
// 日总流量平均值
private Integer dayTotalFlow;
......
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class CrossRunStatePeakDetailAnalysisDataVO {
@ApiModelProperty(value = "峰期名称", example = "早高峰/晚高峰",position = 0)
private String peakName;
@ApiModelProperty(value = "本周交通指数", example = "3.4",position = 1)
private Integer thisWeekTrafficIndex;
@ApiModelProperty(value = "上周交通指数", example = "3.4",position = 2)
private Integer lastWeekTrafficIndex;
@ApiModelProperty(value = "本周通行能力", example = "15900",position = 3)
private Integer thisWeekWorkCapacity;
@ApiModelProperty(value = "上周通行能力", example = "16000",position = 4)
private Integer lastWeekCapacity;
@ApiModelProperty(value = "本周平均延误(S)", example = "40",position = 5)
private Integer thisWeekWorkDelayTime;
@ApiModelProperty(value = "上周平均延误(S)", example = "40",position = 6)
private Integer lastWeekDelayTime;
@ApiModelProperty(value = "本周最大排队", example = "240",position = 7)
private Integer thisWeekMaxQueueLength;
@ApiModelProperty(value = "上周最大排队", example = "240",position = 8)
private Integer lastWeekMaxQueueLength;
@ApiModelProperty(value = "本周停车次数", example = "4",position = 9)
private Integer thisWeekStopTimes;
@ApiModelProperty(value = "上周停车次数", example = "3.5",position = 10)
private Integer lastWeekStopTimes;
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class CrossRunStatePeakResultResponseVO {
@ApiModelProperty(value = "路口名称", example = "经十路(舜耕路-山大路)")
private String crossName;
@ApiModelProperty(value = "工作日早高峰平均交通指数与上周比较情况", example = "增加【减少】10%")
private String amPeakAvgTrafficIndexLastWeekCompare;
@ApiModelProperty(value = "工作日晚高峰平均交通指数与上周比较情况", example = "增加【减少】10%")
private String pmPeakAvgTrafficIndexLastWeekCompare;
@ApiModelProperty(value = "工作日早高峰通行能力与上周比较情况", example = "提升【下降】5%")
private String amPeakCapacityLastWeekCompare;
@ApiModelProperty(value = "工作日晚高峰通行能力与上周比较情况", example = "提升【下降】5%")
private String pmPeakCapacityLastWeekCompare;
@ApiModelProperty(value = "工作日早高峰平均延误与上周比较情况", example = "增加【减少】11%")
private String amPeakDelayTimeLastWeekCompare;
@ApiModelProperty(value = "工作日晚高峰平均延误与上周比较情况", example = "增加【减少】11%")
private String pmPeakDelayTimeLastWeekCompare;
@ApiModelProperty(value = "工作日早高峰最大排队与上周比较情况", example = "增加【减少】11%")
private String amPeakMaxQueueLengthLastWeekCompare;
@ApiModelProperty(value = "工作日晚高峰最大排队与上周比较情况", example = "增加【减少】11%")
private String pmPeakMaxQueueLengthLastWeekCompare;
@ApiModelProperty(value = "工作日早高峰停车次数与上周比较情况", example = "增加【减少】5%")
private String amPeakStopTimesLastWeekCompare;
@ApiModelProperty(value = "工作日晚高峰停车次数与上周比较情况", example = "增加【减少】5%")
private String pmPeakStopTimesLastWeekCompare;
@ApiModelProperty(value = "总体运行效果", example = "明显提升【略有下降】")
private String totalityRunSituation;
//================================================================================================//
@ApiModelProperty(value = "本周早高峰集中时段", example = "7:30~8:30")
private String thisWeekAmPeakTimeSpan;
@ApiModelProperty(value = "本周早高峰集中时段持续时长", example = "45分钟")
private String thisWeekAmPeakDuration;
@ApiModelProperty(value = "本周早高峰时段开始时间上周比较情况", example = "提前【延后】20分钟")
private String thisWeekAmPeakStartTimeSituation;
@ApiModelProperty(value = "本周早高峰时段结束时间上周比较情况", example = "提前【延后】20分钟")
private String thisWeekAmPeakEndTimeSituation;
@ApiModelProperty(value = "本周早高峰持续时长上周比较情况", example = "提前【延后】20分钟")
private String thisWeekAmPeakDurationSituation;
@ApiModelProperty(value = "本周早高峰集中时段", example = "7:30~8:30")
private String thisWeekPmPeakTimeSpan;
@ApiModelProperty(value = "本周早高峰集中时段持续时长", example = "45分钟")
private String thisWeekPmPeakDuration;
@ApiModelProperty(value = "本周早高峰时段开始时间上周比较情况", example = "提前【延后】20分钟")
private String thisWeekPmPeakStartTimeSituation;
@ApiModelProperty(value = "本周早高峰时段结束时间上周比较情况", example = "提前【延后】20分钟")
private String thisWeekPmPeakEndTimeSituation;
@ApiModelProperty(value = "本周早高峰持续时长上周比较情况", example = "提前【延后】20分钟")
private String thisWeekPmPeakDurationSituation;
//================================================================================================//
//峰期交通流参数对比分析
private List<CrossRunStatePeakDetailAnalysisDataVO> dataList = new ArrayList<>();
//高峰期时段分析
private List<CrossRunStatePeakTimeSpanAnalysisDataVO> peakList = new ArrayList<>();
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class CrossRunStatePeakTimeSpanAnalysisDataVO {
@ApiModelProperty(value = "星期", example = "周一",position = 0)
private String weekName;
@ApiModelProperty(value = "本周早高峰时段", example = "7:00~8:00",position = 1)
private String thisWeekAmPeakTimeSpan;
@ApiModelProperty(value = "上周早高峰时段", example = "7:00~8:00",position = 2)
private String lastWeekAmPeakTimeSpan;
@ApiModelProperty(value = "本周早高峰持续时长(min)", example = "30",position = 3)
private String thisWeekAmPeakDuration;
@ApiModelProperty(value = "上周早高峰持续时长(min)", example = "30",position = 4)
private String lastWeekAmPeakDuration;
@ApiModelProperty(value = "本周晚高峰时段", example = "7:00~8:00",position = 5)
private String thisWeekPmPeakTimeSpan;
@ApiModelProperty(value = "上周晚高峰时段", example = "7:00~8:00",position = 6)
private String lastWeekPmPeakTimeSpan;
@ApiModelProperty(value = "本周晚高峰持续时长(min)", example = "30",position = 7)
private String thisWeekPmPeakDuration;
@ApiModelProperty(value = "上周晚高峰持续时长(min)", example = "30",position = 8)
private String lastWeekPmPeakDuration;
}
\ No newline at end of file
......@@ -184,7 +184,7 @@ public class StrategyPriorityController {
return jsonView;
}
@ApiOperation(value = "策略管理-策略参数配置批量保存", notes = "批量保存", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,hidden = false)
@ApiOperation(value = "策略管理-策略参数配置路口干线批量保存", notes = "批量保存", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,hidden = false)
@ApiImplicitParams({
@ApiImplicitParam(name = "strategyPriorityGroup", value = "参数配置数据", required = false, dataType = "String"),
})
......@@ -202,15 +202,18 @@ public class StrategyPriorityController {
}
@ApiOperation(value = "策略管理-参数配置数据回显", notes = "数据回显", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,hidden = false)
@ApiOperation(value = "策略管理-参数配置干线路口数据回显", notes = "数据回显", produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,hidden = false)
@ApiImplicitParams({
@ApiImplicitParam(name = "crossId", value = "路口id", required = true, dataType = "String")
@ApiImplicitParam(name = "crossId", value = "路口id", required = false, dataType = "String"),
@ApiImplicitParam(name = "greenId", value = "干线id", required = false, dataType = "Integer"),
@ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "Integer"),
})
@GetMapping("/getParamConfigData")
public JsonViewObject getParamConfigData(@RequestParam(required = true) String crossId){
public JsonViewObject getParamConfigData(@RequestParam(required = false) String crossId,@RequestParam(required = false) Integer greenId,
@RequestParam(required = true) Integer type){
JsonViewObject jsonView = JsonViewObject.newInstance();
try {
List<StrategyParameterConfig>list=strategyPriorityService.getParamConfigData(crossId);
List<StrategyParameterConfig>list=strategyPriorityService.getParamConfigData(crossId,greenId,type);
jsonView.success(list);
} catch (Exception e) {
jsonView.fail(I18nResourceBundle.getConstants("SAVE_FAILED_MSG"));
......
package net.wanji.opt.dao.mapper.report;
import net.wanji.opt.controllerv2.report.vo.CrossPeakAnalysis;
import net.wanji.opt.entity.report.AnalysisReportCrossPeakDetail;
import net.wanji.opt.entity.report.CrossRidLaneDTO;
import org.apache.ibatis.annotations.Param;
......@@ -9,5 +10,7 @@ import java.util.List;
public interface CrossRidLaneMapper {
List<CrossRidLaneDTO> getCrossInfoList(@Param("crossIdList") List<String> crossIdList);
List<CrossPeakAnalysis> getTotalitySituation(@Param("crossIdList") List<String> crossIdList,@Param("yearWeek") Integer yearWeek,@Param("dayType") Integer dayType,@Param("peakType") Integer peakType);
List<CrossPeakAnalysis> getTotalitySituation(@Param("crossIdList") List<String> crossIdList,@Param("yearWeek") Integer yearWeek,@Param("dayType") String dayType,@Param("peakType") String peakType);
List<AnalysisReportCrossPeakDetail> getPeakData(@Param("crossIdList") List<String> crossIdList,@Param("yearWeek") Integer yearWeek);
}
......@@ -89,7 +89,7 @@ public interface StrategyPriorityMapper extends BaseMapper<StrategyPriorityDaily
void saveParamConfig(@Param("savePlanList") List<StrategyParameterConfig> savePlanList);
List<StrategyParameterConfig> getParamConfigData(String crossId);
List<StrategyParameterConfig> getParamConfigData(@Param("crossId") String crossId,@Param("type")Integer type);
List<StrategyPriorityDailyInfo> getStrategyGreenWave();
......@@ -106,5 +106,11 @@ public interface StrategyPriorityMapper extends BaseMapper<StrategyPriorityDaily
void deleteGreenPlanConfig(Integer greenId);
List<StrategyPriorityDailyInfo> getGreenPlanConfigData(@Param("greenId") Integer greenId,@Param("type")Integer type);
List<StrategyParameterConfig> paramterGreenConfigTable(Integer greenId);
void deleteGreenParamterConfig(Integer greenId);
List<StrategyParameterConfig> getGreenParamConfigData(@Param("greenId") Integer greenId, @Param("type") Integer type);
}
......@@ -31,5 +31,6 @@ public class SchemeGreenDirGreenTimeDTO {
private Integer end;
private Integer dir;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(value = "query_date")
private Date date;
}
package net.wanji.opt.entity.report;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel(description = "干线拥堵详情实体类")
public class AnalysisReportCrossPeakDetail {
@ApiModelProperty(value = "路口ID", example = "13NG90B5V90")
private String crossId;
@ApiModelProperty(value = "星期几:1~7代表周一至周日", example = "1")
private Integer weekDay;
@ApiModelProperty(value = "高峰类型 1早高峰 2晚高峰 3平峰", example = "1")
private String peakType;
@ApiModelProperty(value = "类型:1工作日 2周末", example = "1")
private String dayType;
@ApiModelProperty(value = "峰期开始时间", example = "2025-04-15 08:00:00")
private Date peakStartTime;
@ApiModelProperty(value = "峰期截止时间", example = "2025-04-15 09:00:00")
private Date peakEndTime;
@ApiModelProperty(value = "天总流量", example = "10000")
private Integer dayTotalFlow;
@ApiModelProperty(value = "天最大小时流量", example = "1200")
private Integer dayMaxHourFlow;
@ApiModelProperty(value = "峰期内最大小时流量", example = "800")
private Integer peakMaxHourFlow;
@ApiModelProperty(value = "峰期内平均交通指数", example = "2.5")
private Double peakTrafficIndex;
@ApiModelProperty(value = "峰期内通行能力", example = "1500")
private Integer peakCapacity;
@ApiModelProperty(value = "峰期内平均延误时长", example = "10.5")
private Double peakAvgDeayTime;
@ApiModelProperty(value = "峰期内最大排队长度,单位米", example = "50")
private Integer peakMaxQueueLength;
@ApiModelProperty(value = "峰期内平均延误指数", example = "3.2")
private Double peakAvgStopTimes;
@ApiModelProperty(value = "一年中的第几周,格式yyyyw,如20251", example = "20251")
private Integer yearWeek;
@ApiModelProperty(value = "一周的第一天", example = "2025-04-14 00:00:00")
private Date weekStartTime;
@ApiModelProperty(value = "一周的最后一天", example = "2025-04-20 23:59:59")
private Date weekEndTime;
@ApiModelProperty(value = "数据插入时间", example = "2025-04-15 12:34:56")
private Date insertTime;
@ApiModelProperty(value = "最大流量", example = "1200")
private Integer maxFlow;
}
\ No newline at end of file
package net.wanji.opt.entity.strategy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
......@@ -12,7 +13,7 @@ import java.io.Serializable;
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("t_strategy_parameter_config")
@TableName("t_strategy_priority_parameter")
@NoArgsConstructor
@AllArgsConstructor
public class StrategyParameterConfig implements Serializable {
......@@ -45,6 +46,13 @@ public class StrategyParameterConfig implements Serializable {
* 调度配置执行详情
*/
private String schedulingParam;
/**
* 干线ID
*/
private Integer greenId;
/**
* 类型 1:路口 2干线
*/
private Integer type;
}
......@@ -177,17 +177,23 @@ import java.util.stream.Collectors;
allHourset.add(formattedTimeRange);
}
}
//取出路口
for (AnalysisProblemGreenHour singcorss:listCross){
eventTypeCross = singcorss.getEventType();
typeNameCross = singcorss.getTypeName();
String crossName = singcorss.getCrossName();
allCorss.add(crossName);
}
//取出路段
for (AnalysisProblemGreenHour roadLine: listCrossLine){
String roadName = roadLine.getRoadName();
listRoadLine.add(roadName);
// 如果时间段为空,则清空路口和路段集合
if (allHourset.isEmpty()) {
allCorss.clear(); // 清空路口集合
listRoadLine.clear(); // 清空路段集合
}else {
//取出路口
for (AnalysisProblemGreenHour singcorss : listCross) {
eventTypeCross = singcorss.getEventType();
typeNameCross = singcorss.getTypeName();
String crossName = singcorss.getCrossName();
allCorss.add(crossName);
}
//取出路段
for (AnalysisProblemGreenHour roadLine : listCrossLine) {
String roadName = roadLine.getRoadName();
listRoadLine.add(roadName);
}
}
JSONObject jsonObject =new JSONObject();
jsonObject.put("eventLabel",typeNameCross);
......
......@@ -2,6 +2,7 @@ package net.wanji.opt.servicev2.report;
import com.alibaba.fastjson.JSONObject;
import net.wanji.opt.controllerv2.report.vo.CrossRunStateAnalysisResultResponseDTO;
import net.wanji.opt.controllerv2.report.vo.CrossRunStatePeakResultResponseVO;
import net.wanji.opt.vo2.report.CrossRidLaneResult;
import java.util.List;
......@@ -10,4 +11,6 @@ public interface CrossRidLaneService {
List<CrossRidLaneResult> getCrossInfoList(String crossIds);
CrossRunStateAnalysisResultResponseDTO getTotalitySituation(String crossIds, Integer year, Integer week);
List<CrossRunStatePeakResultResponseVO> getPeakData(String crossIds, Integer year, Integer week);
}
......@@ -44,7 +44,7 @@ public interface StrategyPriorityService extends IService<StrategyPriorityDailyI
void saveParamterConfig(StrategyPriorityGroup strategyPriorityGroup) throws JsonProcessingException;
List<StrategyParameterConfig> getParamConfigData(String crossId);
List<StrategyParameterConfig> getParamConfigData(String crossId,Integer greenId, Integer type);
List<StrategyPriorityDailyInfo> getStrategyGreenWave();
}
......@@ -310,9 +310,9 @@ import java.util.stream.Collectors;
return planList;
}
/*
* 策略参数配置
* */
/*
* 策略参数配置干线路口
* */
@Override
@Transactional
public void saveParamterConfig(StrategyPriorityGroup group) throws JsonProcessingException {
......@@ -321,32 +321,66 @@ import java.util.stream.Collectors;
List<StrategyParameterConfig> savePlanList = new ArrayList<>();
//路口ID
List<String> crossList = group.getCrossIds();
//选中多个路口存多条数据
for (String crossId : crossList) {
StrategyParameterConfig strategyParameterConfig = new StrategyParameterConfig();
//策略编号
String strategyNo = group.getStrategyNo();
strategyParameterConfig.setStrategyNo(strategyNo);
//路口id
//String crossId = group.getCrossId();
strategyParameterConfig.setCrossId(crossId);
//先判断表里有没有数据,有的话删除t_strategy_priority_parameter
List<StrategyParameterConfig> paramterConfig = strategyPriorityMapper.paramterConfigTable(crossId);
if (paramterConfig.size() > 0) {
strategyPriorityMapper.deleteParamterConfig(crossId);
//干线id
List<Integer> greenIdList = group.getGreenIds();
//Type : 1;路口2:干线
Integer typePd=group.getType();
if(typePd==1) {
//选中多个路口存多条数据
for (String crossId : crossList) {
StrategyParameterConfig strategyParameterConfig = new StrategyParameterConfig();
//Type : 1;路口2:干线
Integer type=group.getType();
strategyParameterConfig.setType(type);
//策略编号
String strategyNo = group.getStrategyNo();
strategyParameterConfig.setStrategyNo(strategyNo);
//路口id
//String crossId = group.getCrossId();
strategyParameterConfig.setCrossId(crossId);
//先判断表里有没有数据,有的话删除t_strategy_priority_parameter
List<StrategyParameterConfig> paramterConfig = strategyPriorityMapper.paramterConfigTable(crossId);
if (paramterConfig.size() > 0) {
strategyPriorityMapper.deleteParamterConfig(crossId);
}
//参数 场景配置
List<StrategyPriorityParamter> parameterConfigList = group.getParameterConfigList();
String jsonString = JSON.toJSONString(parameterConfigList);
strategyParameterConfig.setParamDetails(jsonString);
//策略调度参数配置
StrategySchedulingParam schedulingParamters = group.getSchedulingParamters();
ObjectMapper objectMapper = new ObjectMapper();
String schedulingParamter = objectMapper.writeValueAsString(schedulingParamters);
strategyParameterConfig.setSchedulingParam(schedulingParamter);
//添加到最终数据
savePlanList.add(strategyParameterConfig);
}
//参数 场景配置
List<StrategyPriorityParamter> parameterConfigList = group.getParameterConfigList();
String jsonString = JSON.toJSONString(parameterConfigList);
strategyParameterConfig.setParamDetails(jsonString);
//策略调度参数配置
StrategySchedulingParam schedulingParamters = group.getSchedulingParamters();
ObjectMapper objectMapper = new ObjectMapper();
String schedulingParamter = objectMapper.writeValueAsString(schedulingParamters);
strategyParameterConfig.setSchedulingParam(schedulingParamter);
//添加到最终数据
savePlanList.add(strategyParameterConfig);
}else if (typePd==2){
for (Integer greenId : greenIdList) {
StrategyParameterConfig strategyParameterConfig = new StrategyParameterConfig();
//Type : 1;路口2:干线
Integer type=group.getType();
strategyParameterConfig.setType(type);
//策略编号
String strategyNo = group.getStrategyNo();
strategyParameterConfig.setStrategyNo(strategyNo);
//路口id
//String crossId = group.getCrossId();
strategyParameterConfig.setGreenId(greenId);
//先判断表里有没有数据,有的话删除t_strategy_priority_parameter
List<StrategyParameterConfig> paramterConfig = strategyPriorityMapper.paramterGreenConfigTable(greenId);
if (paramterConfig.size() > 0) {
strategyPriorityMapper.deleteGreenParamterConfig(greenId);
}
//参数 场景配置
List<StrategyPriorityParamter> parameterConfigList = group.getParameterConfigList();
String jsonString = JSON.toJSONString(parameterConfigList);
strategyParameterConfig.setParamDetails(jsonString);
//添加到最终数据
savePlanList.add(strategyParameterConfig);
}
}
strategyPriorityMapper.saveParamConfig(savePlanList);
......@@ -357,12 +391,24 @@ import java.util.stream.Collectors;
}
/*
* 策略参数配置数据回显
* 策略参数配置干线路口数据回显
* */
@Override
public List<StrategyParameterConfig> getParamConfigData(String crossId) {
public List<StrategyParameterConfig> getParamConfigData(String crossId,Integer greenId, Integer type) {
try {
List<StrategyParameterConfig> paraterConfigList = strategyPriorityMapper.getParamConfigData(crossId);
List<StrategyParameterConfig> paraterConfigList=new ArrayList<>();
//type: 1路口 2干线
if (type==1){
if (crossId.isEmpty()){
throw new IllegalArgumentException("crossId cannot be null");
}
paraterConfigList = strategyPriorityMapper.getParamConfigData(crossId,type);
}else if(type==2){
if (greenId==null){
throw new IllegalArgumentException("greenId cannot be null");
}
paraterConfigList = strategyPriorityMapper.getGreenParamConfigData(greenId,type);
}
return paraterConfigList;
}catch (Exception e){
log.error("{} getParamConfigData", this.getClass().getSimpleName(), e);
......
package net.wanji.opt.task;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.servicev2.judgeanalysis.AnalysisGreenCongestionPeriodService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.ParseException;
@Component
@Configurable
@EnableScheduling
@Slf4j
@Profile("docker")
public class AnalysisGreenCongestionPeriodWeekTask {
@Autowired
private AnalysisGreenCongestionPeriodService analysisGreenCongestionPeriodService;
@Scheduled(cron = "0 0 2 ? * 1")
public void task() throws ParseException {
analysisGreenCongestionPeriodService.selectCountByCongestionPeriod();
analysisGreenCongestionPeriodService.selectCountByLandData();
}
}
package net.wanji.opt.task;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.servicev2.judgeanalysis.AnalysisProblemAndStrategyDayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
@Component
@Configurable
@EnableScheduling
@Slf4j
@Profile("!dev")
public class AnalysisProblemAndStrategyDayTask {
@Autowired
private AnalysisProblemAndStrategyDayService analysisProblemAndStrategyDayService;
@Scheduled(cron = "0 15 1 * * ?")
public void task() {
try {
analysisProblemAndStrategyDayService.selectCountByType();
} catch (Exception e) {
log.error("获取事件优化记录异常", e);
}
}
}
package net.wanji.opt.task;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.dao.mapper.judgeanalysis.AnalysisProblemCrossDayMapper;
import net.wanji.opt.dao.mapper.judgeanalysis.AnalysisProblemGreenDayMapper;
import net.wanji.opt.entity.judgeanalysis.AnalysisProblemCrossDay;
import net.wanji.opt.entity.judgeanalysis.AnalysisProblemGreenDay;
import net.wanji.opt.servicev2.judgeanalysis.impl.AnalysisProblemCrossDayServiceImpl;
import net.wanji.opt.servicev2.judgeanalysis.impl.AnalysisProblemGreenDayServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
@Component
@Configurable
@EnableScheduling
@Slf4j
@Profile("!dev")
public class AnalysisProblemDayTask {
@Autowired
private AnalysisProblemCrossDayServiceImpl analysisProblemCrossDayServiceImpl;
@Autowired
private AnalysisProblemCrossDayMapper analysisProblemCrossDayMapper;
@Autowired
private AnalysisProblemGreenDayMapper analysisProblemGreenDayMapper;
@Autowired
private AnalysisProblemGreenDayServiceImpl nalysisProblemGreenDayServiceImpl;
@Scheduled(cron = "0 15 0 ? * *")
public void task(){
//执行检查路口id是否还有area_id没赋值的数据
analysisProblemCrossDayServiceImpl.updateCrossAreaIdByCondition();
//执行检查绿波id是否还有area_id没赋值的数据
nalysisProblemGreenDayServiceImpl.updateGreenAreaIdByCondition();
//检查昨日数据是否有统计
List<AnalysisProblemCrossDay> list = analysisProblemCrossDayMapper.checkData();
if(list.isEmpty())
{
analysisProblemCrossDayMapper.insertAnalysisProblemCrossDay();
}
//检查昨日数据是否有统计
List<AnalysisProblemGreenDay> list1 = analysisProblemGreenDayMapper.checkData();
if(list1.isEmpty())
{
analysisProblemGreenDayMapper.insertAnalysisProblemGreenDay();
}
}
}
package net.wanji.opt.task;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.dao.mapper.judgeanalysis.AnalysisProblemCrossDayMapper;
import net.wanji.opt.dao.mapper.judgeanalysis.AnalysisProblemGreenDayMapper;
import net.wanji.opt.entity.judgeanalysis.AnalysisProblemCrossDay;
import net.wanji.opt.entity.judgeanalysis.AnalysisProblemGreenDay;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
@Component
@Configurable
@EnableScheduling
@Slf4j
@Profile("!dev")
public class AnalysisProblemHourTask {
@Autowired
private AnalysisProblemCrossDayMapper analysisProblemCrossDayMapper;
@Autowired
private AnalysisProblemGreenDayMapper analysisProblemGreenDayMapper;
@Scheduled(cron = "0 1/60 * * * *")
public void task(){
try {
analysisProblemCrossDayMapper.insertAnalysisProblemCrossHour();
analysisProblemGreenDayMapper.insertAnalysisProblemGreenHour();
}catch (Exception e){
log.error("计算路口方向、绿波方向问题异常",e);
}
}
}
package net.wanji.opt.task;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.framework.Constants;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.opt.kafka.ConsumerHandler;
import net.wanji.opt.service.CrossOptimizeService;
import net.wanji.opt.service.impl.LaneInfoServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @author hfx
* @date 2023/1/16 16:39
* @desc RealtimeOptimizeTask
*/
@RequiredArgsConstructor
@Component
@Slf4j
public class CrossMonitorTask {
private final CrossOptimizeService crossOptimizeService;
private final ConsumerHandler consumerHandler;
private final CrossDataRealtimeMapper crossDataRealtimeMapper;
private final LaneInfoServiceImpl laneInfoService;
/**
* 路口实时监测
*
*/
//@Scheduled(fixedRate = 1 * 60 * 1000)
//public void realtimeMonitor() {
// log.info("路口实时监测任务...");
// 获取路口实时监测数据
//List<CrossDataRealtimePO> crossDataRealtimePOList = listCrossDataRealtime();
//log.info("路口实时数据:{}条", crossDataRealtimePOList.size());
// 测试时无数据暂时注释
// if(crossDataRealtimePOList.isEmpty()) {
// return ;
// }
// 获取所有信控路口异常数据(失衡/拥堵/溢出/死锁)
//List<CrossDataRealtimePO> abnormalCrossList = listAbnormalCross(crossDataRealtimePOList);
//log.info("加载异常路口:{}条", abnormalCrossList.size());
// if(abnormalCrossList.isEmpty()) {
// return ;
// }
// 调用路口实时优化
//crossOptimizeService.realtimeOptimize(abnormalCrossList, crossDataRealtimePOList);
//}
/**
* 获取异常路口数据
*
* @return
*/
public List<CrossDataRealtimePO> listAbnormalCross(List<CrossDataRealtimePO> crossDataRealtimePOList) {
List<CrossDataRealtimePO> dtoList = new ArrayList<>();
CrossDataRealtimePO dto = null;
int status = 0;
for (CrossDataRealtimePO po : crossDataRealtimePOList) {
// 获取失衡、拥堵、溢出路口数据
if (Constants.SystemParam.NO.equals(po.getIsSpillover()) && Constants.SystemParam.NO.equals(po.getIsCongestion()) && Constants.SystemParam.NO.equals(po.getIsUnbalance())) {
continue;
}
if (Constants.SystemParam.YES.equals(po.getIsSpillover())) { // 溢出
status = CrossStatusEnum.SPILLOVER.getCode();
} else if (Constants.SystemParam.YES.equals(po.getIsCongestion())) { // 拥堵
status = CrossStatusEnum.CONGESTION.getCode();
} else if (Constants.SystemParam.YES.equals(po.getIsUnbalance())) { // 失衡
status = CrossStatusEnum.UNBALANCE.getCode();
}
dto = new CrossDataRealtimePO();
BeanUtils.copyProperties(po, dto);
dto.setCrossId(po.getCrossId());
dto.setStatus(status);
dtoList.add(dto);
}
return dtoList;
}
/**
* 获取路口实时监测数据,获取数据中心存入到数据库中的数据
* (暂定从数据中心kafka获取)
*
* @return
*/
public List<CrossDataRealtimePO> listCrossDataRealtime() {
// todo 测试数据
LambdaQueryWrapper<CrossDataRealtimePO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(CrossDataRealtimePO::getCrossId, "14Q0S09IQB0")
.or().eq(CrossDataRealtimePO::getCrossId, "14Q1409IRF0")
.or().eq(CrossDataRealtimePO::getCrossId, "14PU609IQA0")
.or().eq(CrossDataRealtimePO::getCrossId, "14Q1509ISH0")
.or().eq(CrossDataRealtimePO::getCrossId, "14Q1S09IR70")
.or().eq(CrossDataRealtimePO::getCrossId, "14Q0O09INT0");
List<CrossDataRealtimePO> crossDataRealtimePOS = crossDataRealtimeMapper.selectList(queryWrapper);
return crossDataRealtimePOS;
}
}
\ No newline at end of file
package net.wanji.opt.task;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.dao.mapper.report.GreenWaveWeekDataMapper;
import net.wanji.opt.servicev2.report.GreenWaveWeekDataService;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
@Component
@Slf4j
public class GreenWaveWeekDataTask implements ApplicationRunner {
@Resource
private GreenWaveWeekDataService greenWaveWeekDataService;
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("服务启动时--周总体拥堵概况更新--任务执行时间:" + LocalDateTime.now());
// 周总体拥堵概况更新
try {
// greenWaveWeekDataService.insertGreenWaveWeekData();
}catch (Exception e){
log.error("服务启动时--周总体拥堵概况更新--任务执行错误" + e);
}
log.info("服务启动时--周总体拥堵概况更新--任务执行结束时间:" + LocalDateTime.now());
}
/**
* 每周一凌晨 0:30 执行的任务
*/
@Scheduled(cron = "0 30 0 ? * MON")
public void executeWeeklyTask() {
//周总体拥堵概况更新
log.info("定时任务--周总体拥堵概况更新--执行开始时间:" + LocalDateTime.now());
try {
greenWaveWeekDataService.insertGreenWaveWeekData();
}catch (Exception e){
log.error("定时任务--周总体拥堵概况更新--任务执行错误" + e);
}
log.info("定时任务--周总体拥堵概况更新--执行结束时间:" + LocalDateTime.now());
}
}
package net.wanji.opt.task;
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.opt.cache.GreenCrossDirInfoCache;
import net.wanji.opt.common.RedisUtils;
import net.wanji.opt.dao.mapper.GreenChartSchemeRingPhaseMapper;
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;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author duanruiming
* @date 2025/04/15 15:09
*/
@Component
@Slf4j
@Profile("test")
public class HisenseSchemeRingPhaseInfoTask {
@Resource
private RedisUtils redisUtils;
@Resource
private GreenChartSchemeRingPhaseMapper greenChartSchemeRingPhaseMapper;
@Scheduled(fixedRate = 1 * 60 * 1000, initialDelay = 1 * 60 * 1000)
public void getSchemeRingPhase() {
List<SchemeGreenDirGreenTimeDTO> schemeGreenDirGreenTimeDTOS = new ArrayList<>();
ObjectMapper mapper = JacksonUtils.getInstance();
try {
List<GreenCrossDirDTO> greenCrossDirCache = GreenCrossDirInfoCache.greenCrossDirCache;
if (!CollectionUtils.isEmpty(greenCrossDirCache)) {
for (GreenCrossDirDTO greenCrossDirDTO : greenCrossDirCache) {
Integer greenId = greenCrossDirDTO.getGreenId();
String greenCrossId = greenCrossDirDTO.getCrossId();
String greenDirStr = greenCrossDirDTO.getGreenDir();
// 海信环相位信息
String str = (String) redisUtils.getHash("utc-hisense-ring-phase", greenCrossId);
if (StringUtils.isBlank(str)) {
continue;
}
List<RingPhaseInfoDTO> ringPhaseInfoDTOS = mapper.readValue(str, new TypeReference<List<RingPhaseInfoDTO>>() {});
// 遍历绿波路口协调方向
if (StringUtils.isNotBlank(greenDirStr)) {
String[] greenDirArray = greenDirStr.split(",");
for (String s : greenDirArray) {
// 协调方向
Integer greenDir = Integer.valueOf(s);
if (!CollectionUtils.isEmpty(ringPhaseInfoDTOS)) {
Map<Integer, List<RingPhaseInfoDTO>> ringMap = ringPhaseInfoDTOS.stream().collect(Collectors.groupingBy(RingPhaseInfoDTO::getRingNo));
for (Map.Entry<Integer, List<RingPhaseInfoDTO>> entry : ringMap.entrySet()) {
Integer ringNo = entry.getKey();
if (Objects.equals(0, ringNo)) {
continue;
}
List<RingPhaseInfoDTO> ringPhaseList = entry.getValue();
List<RingPhaseInfoDTO> sort = ringPhaseList.stream().sorted(Comparator.comparingInt(RingPhaseInfoDTO::getSort)).collect(Collectors.toList());
Integer start = 0;
SchemeGreenDirGreenTimeDTO schemeGreenDirGreenTimeDTO = new SchemeGreenDirGreenTimeDTO();
for (RingPhaseInfoDTO ringPhaseInfoDTO : sort) {
List<RingPhaseInfoDTO.DirTurn> dirTurnInfoList = ringPhaseInfoDTO.getDirTurnInfoList();
if (CollectionUtils.isEmpty(dirTurnInfoList)) {
continue;
}
Integer phaseId = ringPhaseInfoDTO.getPhaseId();
Integer greenTime = ringPhaseInfoDTO.getGreenTime();
Integer yellowTime = ringPhaseInfoDTO.getYellowTime();
Integer redTime = ringPhaseInfoDTO.getRedTime();
Integer schemeNo = ringPhaseInfoDTO.getSchemeNo();
Integer cycleLen = ringPhaseInfoDTO.getCycleLen();
Integer offset = ringPhaseInfoDTO.getOffset();
Date date = ringPhaseInfoDTO.getDate();
for (RingPhaseInfoDTO.DirTurn dirTurn : dirTurnInfoList) {
Integer dir = dirTurn.getDir();
Integer turn = dirTurn.getTurn();
// 如果路口信息与绿波协调方向相同
// 如果是红灯,作为开始时间,结束时间是start + greenTime + yellowTime
if (Objects.equals(dir, greenDir) && Objects.equals(2, turn)) {
// 黄灯做绿灯处理
schemeGreenDirGreenTimeDTO.setCrossId(greenCrossId);
schemeGreenDirGreenTimeDTO.setSchemeNo(schemeNo);
schemeGreenDirGreenTimeDTO.setDir(dir);
schemeGreenDirGreenTimeDTO.setPhaseId(phaseId);
schemeGreenDirGreenTimeDTO.setStart(start);
schemeGreenDirGreenTimeDTO.setRingNo(ringNo);
schemeGreenDirGreenTimeDTO.setCycleLen(cycleLen);
schemeGreenDirGreenTimeDTO.setOffset(offset);
Integer endTime = start + greenTime + yellowTime;
schemeGreenDirGreenTimeDTO.setEnd(endTime);
schemeGreenDirGreenTimeDTO.setDate(date);
schemeGreenDirGreenTimeDTOS.add(schemeGreenDirGreenTimeDTO);
} else { // 如果是非协调方向, 相位时间作为开始时间
start += greenTime + yellowTime + redTime;
}
}
}
}
}
}
}
}
//log.error("路口绿灯协调方向时间:{}", mapper.writeValueAsString(schemeGreenDirGreenTimeDTOS));
}
if (!CollectionUtils.isEmpty(schemeGreenDirGreenTimeDTOS)) {
for (SchemeGreenDirGreenTimeDTO schemeGreenDirGreenTimeDTO : schemeGreenDirGreenTimeDTOS) {
greenChartSchemeRingPhaseMapper.insert(schemeGreenDirGreenTimeDTO);
}
}
} catch (Exception e) {
log.error("方向环相位入库失败:{}", e);
//throw new RuntimeException(e);
}
}
}
package net.wanji.opt.task;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.framework.Constants;
import net.wanji.databus.dao.mapper.CrossDataRealtimeMapper;
import net.wanji.databus.po.CrossDataRealtimePO;
import net.wanji.opt.kafka.ConsumerHandler;
import net.wanji.opt.service.CrossOptimizeService;
import net.wanji.opt.service.impl.LaneInfoServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 路口、干线事件问题趋势统计
*/
@Component
@Configurable
@EnableScheduling
@Slf4j
@Profile("!dev")
public class ProblemTrendMonitorTask {
@Scheduled(cron = "0 1/5 * * * * ")
public void task(){
}
}
\ No newline at end of file
......@@ -304,7 +304,7 @@
,#{entity.yearWeek}
,#{entity.weekStartTime}
,#{entity.weekEndTime}
,#{entity.insertTime}
,now()
,#{entity.lastWeekCapacity}
,#{entity.lastWeekStopTimes}
,#{entity.lastWeekDelayTime}
......
......@@ -31,18 +31,14 @@
<select id="getTotalitySituation" resultType="net.wanji.opt.controllerv2.report.vo.CrossPeakAnalysis">
SELECT
cross_id,
<if test="dayType = null">
day_type,
</if>
<if test="peakType = null">
peak_type,
</if>
day_type,
peak_type,
COALESCE(avg( day_total_flow ),0) AS day_total_flow ,
COALESCE(avg( day_max_hour_flow ),0) as day_max_hour_flow,
COALESCE(avg( peak_max_hour_flow ),0) as peak_max_hour_flow,
COALESCE(avg( peak_traffic_index ),0) as peak_traffic_index,
COALESCE(avg( peak_capacity ),0) as peak_capacity,
COALESCE(avg( peak_avg_deay_time ),0) as peak_avg_deay_time,
COALESCE(avg( peak_avg_deay_time ),0) as peak_avg_delay_time,
COALESCE(avg( peak_max_queue_length ),0) as peak_max_queue_length,
COALESCE(avg( peak_avg_stop_times ),0) as peak_avg_stop_times
FROM
......@@ -51,12 +47,6 @@
<if test="yearWeek != null">
and year_week = #{yearWeek}
</if>
<if test="dayType != null">
and day_type = #{dayType}
</if>
<if test="peakType != null">
and peak_type = #{peakType}
</if>
<if test="crossIdList != null">
and cross_id in
<foreach collection="crossIdList" item="crossId" separator="," open="(" close=")">
......@@ -64,13 +54,19 @@
</foreach>
</if>
GROUP BY
cross_id
<if test="dayType = null">
,day_type
</if>
<if test="peakType = null">
,peak_type
</if>
cross_id,day_type,peak_type
</select>
<select id="getPeakData" resultType="net.wanji.opt.entity.report.AnalysisReportCrossPeakDetail">
SELECT *
from t_analysis_report_cross_peak_detail
where year_week = #{yearWeek}
<if test="crossIdList != null">
and cross_id in
<foreach collection="crossIdList" item="crossId" open="(" close=")" separator=",">
#{crossId}
</foreach>
</if>
</select>
</mapper>
\ No newline at end of file
......@@ -118,7 +118,7 @@
GROUP_CONCAT(t2.daily_plan_details SEPARATOR ', ') AS dailyPlanDetails
FROM
t_base_cross_info t3
LEFT JOIN t_strategy_priority_daily_info t2 on t3.id = t2.cross_id
LEFT JOIN t_strategy_priority_daily_info t2 on t3.id = t2.cross_id and t2.type=1
LEFT JOIN t_strategy_priority_config t1 on t3.id=t1.cross_id
LEFT JOIN t_greenwave_info t4 on t4.id = t1.green_id
WHERE t3.is_signal='1'
......@@ -126,17 +126,16 @@
</select>
<select id="getStrategyList" parameterType="map" resultType="net.wanji.opt.synthesis.pojo.StrategyFactoryEntity">
SELECT
Distinct
strategy_name,
strategy_no
Distinct
*
FROM
t_strategy_factory_info
WHERE status='1'
</select>
<select id="getSceneList" resultType="net.wanji.opt.synthesis.pojo.StrategyFactoryEntity">
SELECT
Distinct
method
Distinct
*
FROM
t_strategy_factory_info
WHERE status='1'
......@@ -147,7 +146,7 @@
<select id="getCompanyList" resultType="net.wanji.opt.synthesis.pojo.StrategyFactoryEntity">
SELECT
Distinct
company
*
FROM
t_strategy_factory_info
WHERE status='1'
......@@ -330,30 +329,63 @@
AND cross_id =#{crossId}
</if>
</select>
<select id="paramterGreenConfigTable" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyParameterConfig">
SELECT
id,cross_id
FROM t_strategy_priority_parameter
WHERE
1=1
<if test="greenId!=null">
AND green_id =#{greenId}
</if>
</select>
<delete id="deleteParamterConfig">
DELETE
FROM t_strategy_priority_parameter
WHERE cross_id =#{crossId}
</delete>
<delete id="deleteGreenParamterConfig">
DELETE
FROM t_strategy_priority_parameter
WHERE green_id = #{greenId}
</delete>
<insert id="saveParamConfig" parameterType="list" >
INSERT INTO t_strategy_priority_parameter
(cross_id,strategy_no,param_details,scheduling_param)
(cross_id,strategy_no,param_details,scheduling_param,type,green_id)
VALUES
<foreach collection="savePlanList" item="item" separator=",">
(#{item.crossId},#{item.strategyNo},#{item.paramDetails},#{item.schedulingParam})
(#{item.crossId},#{item.strategyNo},#{item.paramDetails},#{item.schedulingParam},#{item.type},#{item.greenId})
</foreach>
</insert>
<select id="getParamConfigData" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyParameterConfig">
SELECT
id,strategy_no,cross_id,param_details,scheduling_param
id,strategy_no,cross_id,param_details,scheduling_param,type
FROM
t_strategy_priority_parameter
WHERE
1=1
<if test="crossId!=null">
<if test="crossId!=null and crossId!=''" >
AND cross_id =#{crossId}
</if>
<if test="type!=null and type!=''">
and type = #{type}
</if>
</select>
<select id="getGreenParamConfigData" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyParameterConfig">
SELECT
id,strategy_no,cross_id,param_details,type
FROM
t_strategy_priority_parameter
WHERE
1=1
<if test="greenId!=null and greenId!=''">
AND green_id =#{greenId}
</if>
<if test="type!=null and type!=''">
and type = #{type}
</if>
</select>
<select id="getStrategyGreenWave" parameterType="map" resultType="net.wanji.opt.entity.strategy.StrategyPriorityDailyInfo">
......
......@@ -5,8 +5,6 @@
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;
......@@ -25,19 +23,19 @@ import javax.annotation.Resource;
@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();
}
// @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