方案数据历史趋势优化时间交叉范围(修改fuseWlRecordTime方法)
This commit is contained in:
@@ -88,6 +88,6 @@
|
|||||||
test_item_id = #{testRecordId}
|
test_item_id = #{testRecordId}
|
||||||
</if>
|
</if>
|
||||||
)
|
)
|
||||||
order by dev_id
|
order by start_time
|
||||||
</select>
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
@@ -33,6 +33,7 @@ import com.njcn.system.enums.DicDataEnum;
|
|||||||
import com.njcn.system.pojo.po.DictData;
|
import com.njcn.system.pojo.po.DictData;
|
||||||
import com.njcn.system.pojo.po.EleEpdPqd;
|
import com.njcn.system.pojo.po.EleEpdPqd;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@@ -51,6 +52,7 @@ import java.util.stream.Stream;
|
|||||||
* @author xuyang
|
* @author xuyang
|
||||||
* @since 2024-04-01
|
* @since 2024-04-01
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class WlRecordServiceImpl extends ServiceImpl<WlRecordMapper, WlRecord> implements IWlRecordService {
|
public class WlRecordServiceImpl extends ServiceImpl<WlRecordMapper, WlRecord> implements IWlRecordService {
|
||||||
@@ -281,8 +283,7 @@ public class WlRecordServiceImpl extends ServiceImpl<WlRecordMapper, WlRecord> i
|
|||||||
}
|
}
|
||||||
//进行时间覆盖(查询的基础数据必须两个以上)
|
//进行时间覆盖(查询的基础数据必须两个以上)
|
||||||
if(data.size()>1){
|
if(data.size()>1){
|
||||||
//fuseWlRecordTime(data,0);
|
data = fuseWlRecordTime(data,0);
|
||||||
//fuseWlRecordTime(data,0);
|
|
||||||
}
|
}
|
||||||
//格式化前端参数
|
//格式化前端参数
|
||||||
formatQueryParamList(commonStatisticalQueryParam);
|
formatQueryParamList(commonStatisticalQueryParam);
|
||||||
@@ -336,18 +337,63 @@ public class WlRecordServiceImpl extends ServiceImpl<WlRecordMapper, WlRecord> i
|
|||||||
/**
|
/**
|
||||||
* 数据项内的时间进行覆盖:解决多个数据项的startTime及endTime之间存在时间冲突
|
* 数据项内的时间进行覆盖:解决多个数据项的startTime及endTime之间存在时间冲突
|
||||||
* @param data 数据项
|
* @param data 数据项
|
||||||
* @param flag 覆盖规则(0:从左到右依次覆盖,1:时间范围度最大依次覆盖)
|
* @param flag 覆盖规则(0:从左到右依次覆盖,1:时间范围度最大依次覆盖) *注:从左到右依次覆盖规则下多个数据项必须按照 "开始时间升序排序"
|
||||||
*/
|
*/
|
||||||
private void fuseWlRecordTime(List<WlRecord> data,int flag){
|
private static List<WlRecord> fuseWlRecordTime(List<WlRecord> data,int flag){
|
||||||
|
List<WlRecord> rs = new ArrayList<>();
|
||||||
|
log.info("覆盖规则为:{}",flag == 0 ? "从左到右依次覆盖":"时间范围度最大依次覆盖");
|
||||||
|
log.info("覆盖前源数据:");
|
||||||
|
for(WlRecord wlRecord : data){
|
||||||
|
log.info("id:{} , startTime:{} , endTime:{}",wlRecord.getId(),wlRecord.getStartTime().format(DateTimeFormatter.ofPattern(DataParam.timeFormat)),wlRecord.getEndTime().format(DateTimeFormatter.ofPattern(DataParam.timeFormat)));
|
||||||
|
}
|
||||||
if(flag == 0){
|
if(flag == 0){
|
||||||
|
//为防止意外 还是进行下排序
|
||||||
|
data = data.stream().sorted(Comparator.comparing(WlRecord::getStartTime)).collect(Collectors.toList());
|
||||||
|
//从左到右依次覆盖
|
||||||
|
//由于覆盖规则是最左原则 所以第一个左主数据一定是有效的
|
||||||
|
rs.add(data.get(0));
|
||||||
|
WlRecord tempRecord = null;
|
||||||
for (int i = 0; i < data.size(); i++) {
|
for (int i = 0; i < data.size(); i++) {
|
||||||
for (int j = 0; j < data.size(); j++) {
|
if(i<data.size()-1){
|
||||||
if(data.get(0).getEndTime().isBefore(data.get(j+1).getEndTime())){
|
WlRecord current = null;
|
||||||
|
//当前比较的左主数据
|
||||||
|
if(tempRecord == null){
|
||||||
|
//正常便利获取左主数据(1-2,2-3,3-4...)
|
||||||
|
current = data.get(i);
|
||||||
|
}else{
|
||||||
|
//上一轮左主数据把上一轮的被比数据吃掉了 那么继续拿上一轮数据作为左主数据进行比较(1-2,1-3,1-4,4-5,4-5...)
|
||||||
|
current = tempRecord;
|
||||||
|
}
|
||||||
|
//下一个被比较数据
|
||||||
|
int index = i + 1;
|
||||||
|
WlRecord next = data.get(index);
|
||||||
|
//判断下一个数据时间范围是不是在当前时间范围内(判断是否有修改的必要)
|
||||||
|
if((current.getStartTime().compareTo(next.getStartTime())<0 || current.getStartTime().compareTo(next.getStartTime())==0)
|
||||||
|
&& (current.getEndTime().compareTo(next.getEndTime())>0 || current.getEndTime().compareTo(next.getEndTime())==0)){
|
||||||
|
//如果当前节点把下一个节点吃掉了 那么此节点将不变继续作为当前比较的左主数据 参加下一轮比较
|
||||||
|
tempRecord = current;
|
||||||
|
continue;
|
||||||
|
}else if(current.getEndTime().compareTo(next.getStartTime())<0){
|
||||||
|
//这种属于两个节点的数据本来就没有交叉 属于正常时间串
|
||||||
|
rs.add(next);
|
||||||
|
tempRecord = null;
|
||||||
|
}else{
|
||||||
|
//时间出现交叉
|
||||||
|
next.setStartTime(current.getEndTime().plusSeconds(1));
|
||||||
|
rs.add(next);
|
||||||
|
tempRecord = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
//时间范围度最大依次覆盖
|
||||||
|
//此处逻辑暂定 默认按照上面最左原则
|
||||||
}
|
}
|
||||||
|
log.info("覆盖后新数据:");
|
||||||
|
for(WlRecord wlRecord : rs){
|
||||||
|
log.info("id:{} , startTime:{} , endTime:{}",wlRecord.getId(),wlRecord.getStartTime().format(DateTimeFormatter.ofPattern(DataParam.timeFormat)),wlRecord.getEndTime().format(DateTimeFormatter.ofPattern(DataParam.timeFormat)));
|
||||||
|
}
|
||||||
|
return rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void formatQueryParamList(CommonStatisticalQueryParam commonStatisticalQueryParam){
|
private void formatQueryParamList(CommonStatisticalQueryParam commonStatisticalQueryParam){
|
||||||
|
|||||||
Reference in New Issue
Block a user