Commit 4a1217c9 authored by hanbing's avatar hanbing

[update] 新信号评价-方案评价-根据入参筛选结果集

parent b550d0ce
package net.wanji.opt.bo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author Kent HAN
* @date 2023/6/9 13:52
*/
@Data
@ApiModel(value = "ProblemSchemeBO", description = "问题方案列表接收参数")
public class ProblemSchemeBO {
@ApiModelProperty(value = "路口ID", required = true)
private String crossId;
@ApiModelProperty(value = "开始日期 yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date startDate;
@ApiModelProperty(value = "结束日期 yyyy-MM-dd")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date endDate;
@ApiModelProperty(value = "开始时间 HH:mm")
String startTime;
@ApiModelProperty(value = "结束时间 HH:mm")
String endTime;
}
package net.wanji.opt.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.service.impl.SchemeEvaluateServiceImpl;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.ws.rs.core.MediaType;
import java.util.List;
/**
* 运行评价
*
* @author Kent HAN
*/
@Api(value = "SchemeEvaluateController", description = "方案评价")
@RequestMapping("/schemeEvaluate")
@RestController
public class SchemeEvaluateController {
private final SchemeEvaluateServiceImpl schemeEvaluateService;
public SchemeEvaluateController(SchemeEvaluateServiceImpl schemeEvaluateService) {
this.schemeEvaluateService = schemeEvaluateService;
}
@ApiOperation(value = "问题方案列表", notes = "问题方案列表", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/problemSchemeList",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = SchemeEvaluateProblemSchemeVO.class),
})
public JsonViewObject problemSchemeList(@RequestBody ProblemSchemeBO problemSchemeBO) {
List<SchemeEvaluateProblemSchemeVO> res = schemeEvaluateService.problemSchemeList(problemSchemeBO);
return JsonViewObject.newInstance().success(res);
}
}
\ No newline at end of file
package net.wanji.opt.service;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import java.util.List;
public interface SchemeEvaluateService {
List<SchemeEvaluateProblemSchemeVO> problemSchemeList(ProblemSchemeBO problemSchemeBO);
}
package net.wanji.opt.service.impl;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import net.wanji.databus.dao.mapper.CrossDataHistMapper;
import net.wanji.databus.po.CrossDataHistPO;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.service.SchemeEvaluateService;
import net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Kent HAN
* @date 2023/8/25 16:09
*/
@Slf4j
@Service
public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
private final CrossDataHistMapper crossDataHistMapper;
public SchemeEvaluateServiceImpl(CrossDataHistMapper crossDataHistMapper) {
this.crossDataHistMapper = crossDataHistMapper;
}
@Override
public List<SchemeEvaluateProblemSchemeVO> problemSchemeList(ProblemSchemeBO problemSchemeBO) {
List<SchemeEvaluateProblemSchemeVO> res = new ArrayList<>();
String crossId = problemSchemeBO.getCrossId();
Date startDate = problemSchemeBO.getStartDate();
Date endDate = problemSchemeBO.getEndDate();
endDate = DateUtil.offsetDay(endDate, 1); // 包含最后一天
int startDateStamp = (int) (startDate.getTime() / 1000); // 10位时间戳
int endDateStamp = (int) (endDate.getTime() / 1000);
String startTime = problemSchemeBO.getStartTime();
String endTime = problemSchemeBO.getEndTime();
List<CrossDataHistPO> crossDataHistPOList =
crossDataHistMapper.selectByCrossIdAndStartEnd(crossId, startDateStamp, endDateStamp);
// 根据入参筛选结果
Map<String, List<CrossDataHistPO>> stringListMap = getStringListMap(
crossDataHistPOList, endTime, startTime);
return res;
}
@NotNull
private static Map<String, List<CrossDataHistPO>> getStringListMap(List<CrossDataHistPO> crossDataHistPOList, String endTime, String startTime) {
// 过滤有问题的记录
List<CrossDataHistPO> filteredList = crossDataHistPOList.stream()
.filter(po -> po.getStatus() != null && po.getStatus() != 0)
.collect(Collectors.toList());
// 保留 duration 最大的一条
List<CrossDataHistPO> result = filteredList.stream()
.collect(Collectors.groupingBy(CrossDataHistPO::getStartTime))
.values().stream()
.map(list -> list.stream().max(Comparator.comparingInt(CrossDataHistPO::getDuration)).orElse(null))
.collect(Collectors.toList());
// 按照 startTime 和 endTime 的 "HH:mm" 的时间区间分组
Map<String, List<CrossDataHistPO>> groupedByTimeInterval = result.stream()
.collect(Collectors.groupingBy(po -> {
Date startTime1 = po.getStartTime();
Date endTime1 = new Date(startTime1.getTime() + po.getDuration() * 60 * 1000);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
return sdf.format(startTime1) + " - " + sdf.format(endTime1);
}));
// 过滤 groupedByTimeInterval,保留与 startTime 和 endTime 有交叉的条目
Map<String, List<CrossDataHistPO>> filteredGroupedByTimeInterval = groupedByTimeInterval.entrySet().stream()
.filter(entry -> {
String[] times = entry.getKey().split(" - ");
String groupStartTime = times[0];
String groupEndTime = times[1];
return (groupStartTime.compareTo(endTime) < 0 || groupStartTime.equals(endTime))
&& (groupEndTime.compareTo(startTime) > 0 || groupEndTime.equals(startTime));
})
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
return filteredGroupedByTimeInterval;
}
}
package net.wanji.opt.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "SchemeEvaluateProblemSchemeVO", description = "问题方案列表元素")
public class SchemeEvaluateProblemSchemeVO {
@ApiModelProperty(value = "问题次数")
private Integer problemCounts;
@ApiModelProperty(value = "问题方案个数")
private Integer schemeCounts;
@ApiModelProperty(value = "效率问题个数")
private Integer efficiencyProblemCounts;
@ApiModelProperty(value = "均衡问题个数")
private Integer balanceProblemCounts;
@ApiModelProperty(value = "安全问题个数")
private Integer securityProblemCounts;
@ApiModelProperty(value = "问题方案列表(根据日期)")
private List<ByDateVO> problemSchemeListByDate;
@ApiModelProperty(value = "问题方案列表(根据方案)")
private List<BySchemeVO> problemSchemeListByScheme;
@NoArgsConstructor
@Data
public static class ByDateVO {
@ApiModelProperty(value = "日期")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "M/d", timezone = "GMT+8")
private Date problemDate;
@ApiModelProperty(value = "效率问题个数")
private Integer efficiencyProblemCounts;
@ApiModelProperty(value = "均衡问题个数")
private Integer balanceProblemCounts;
@ApiModelProperty(value = "安全问题个数")
private Integer securityProblemCounts;
@ApiModelProperty(value = "时段方案列表")
private List<SectionSechemeVO> sectionSechemeList;
}
@NoArgsConstructor
@Data
public static class SectionSechemeVO {
@ApiModelProperty(value = "时段")
private String timeSection;
@ApiModelProperty(value = "方案名称")
private String schemeName;
}
@NoArgsConstructor
@Data
public static class BySchemeVO {
@ApiModelProperty(value = "方案名称")
private String schemeName;
@ApiModelProperty(value = "日期")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "M/d", timezone = "GMT+8")
private Date problemDate;
@ApiModelProperty(value = "开始时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm", timezone = "GMT+8")
Date startTime;
@ApiModelProperty(value = "结束时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm", timezone = "GMT+8")
Date endTime;
}
}
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